首页 > 其他分享 >Go 语言反射(Reflect)

Go 语言反射(Reflect)

时间:2023-08-14 21:13:24浏览次数:40  
标签:reflect 反射 fmt ValueOf value Reflect Println bookdetail Go

Go语言提供了一种机制,在不知道具体类型的情况下,可以用反射来更新变量值,查看变量类型

Typeof

package main

import (
"fmt"
"reflect"
)

func main() {
var booknum float32 = 6
var isbook bool = true
bookauthor := "www.w3cschool.cn"
bookdetail := make(map[string]string)
bookdetail["Go语言教程"]="www.w3cschool.cn"
fmt.Println(reflect.TypeOf(booknum))
fmt.Println(reflect.TypeOf(isbook))
fmt.Println(reflect.TypeOf(bookauthor))
fmt.Println(reflect.TypeOf(bookdetail))
}

 

通过反射获取值

package main

import (
"fmt"
"reflect"
)

func main() {
var booknum float32 = 6
var isbook bool = true
bookauthor := "www.w3cschool.cn"
bookdetail := make(map[string]string)
bookdetail["Go语言教程"]="www.w3cschool.cn"
fmt.Println(reflect.ValueOf(booknum))
fmt.Println(reflect.ValueOf(isbook))
fmt.Println(reflect.ValueOf(bookauthor))
fmt.Println(reflect.ValueOf(bookdetail))
}

通过反射设置值

package main

import (
"fmt"
"reflect"
)

func reflectsetvalue1(x interface{}){
value:=reflect.ValueOf(x)
if value.Kind() == reflect.String{
value.SetString("欢迎来到W3Cschool")
}
}
func reflectsetvalue2(x interface{}){
value:=reflect.ValueOf(x)
// 反射中使用Elem()方法获取指针所指向的值
if value.Elem().Kind() == reflect.String{
value.Elem().SetString("欢迎来到W3Cschool")
}
}

func main() {
address := "www.w3cschool.cn"
// reflectsetvalue1(address)
// 反射修改值必须通过传递变量地址来修改。若函数传递的参数是值拷贝,则会发生下述错误。
// panic: reflect: reflect.Value.SetString using unaddressable value
reflectsetvalue2(&address)
fmt.Println(address)
}

标签:reflect,反射,fmt,ValueOf,value,Reflect,Println,bookdetail,Go
From: https://www.cnblogs.com/fczlm/p/17629751.html

相关文章

  • 13 桥接模式 -- go语言设计模式
    桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(HandleandBody)模式或接口(interface)模式。桥接模式的实现代码packagemainimport"fmt"//发送信息的具体实现(操作)typeMessageImplementerinterface{ send(test,......
  • 让 GPT-4 来修复 Golang “数据竞争”问题 - 每天5分钟玩转 GPT 编程系列(6)
    目录1.Golang中的“数据竞争”2.GoPool中的数据竞争问题3.让GPT-4来修复数据竞争问题3.1和GPT-4的第一轮沟通3.2和GPT-4的第二轮沟通3.3提交代码4.总结1.Golang中的“数据竞争”我在上个月发过一篇《跟着GPT-4从0到1学习Golang并发机制(三)》,文中有一节专......
  • E. Maximum Monogonosity
    E.MaximumMonogonosityYouaregivenanarray$a$oflength$n$andanarray$b$oflength$n$.Thecostofasegment$[l,r]$,$1\lel\ler\len$,isdefinedas$|b_l-a_r|+|b_r-a_l|$.Recallthattwosegments$[l_1,r_1]$,$1\lel_1\ler......
  • Go 语言范围(Range)
    range关键字用于for循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。packagemainimport"fmt"funcmain(){//这是我们使用range去求一个slice的和。使用数组跟这个很类似nums:=[]int{2,3,4}sum:=0for_,num:=rangenums{......
  • Go 语言Map(集合)
    定义Map/*声明变量,默认map是nil*/varmap_variablemap[key_data_type]value_data_type/*使用make函数*/map_variable=make(map[key_data_type]value_data_type) packagemainimport"fmt"funcmain(){varcountryCapitalMapmap[string]string/*创建......
  • Go 语言递归函数
    递归,就是在运行的过程中调用自己。阶乘packagemainimport"fmt"funcFactorial(xint)(resultint){ifx==0{result=1}else{result=x*Factorial(x-1)}return}funcmain(){variint=15fmt.Printf("%d的阶乘是%d\n",i......
  • Go 语言类型转换
    packagemainimport"fmt"funcmain(){varsumint=17varcountint=5varmeanfloat32mean=float32(sum)/float32(count)fmt.Printf("mean的值为:%f\n",mean)}go不支持隐式转换类型错:packagemainimport"fmt"funcmain(......
  • Go 语言接口
    Go语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。 packagemainimport("fmt")typePhoneinterface{call()}typeNokiaPhonestruct{}func(nokiaPhoneNokiaPhone)call(){fmt......
  • Go 语言切片(Slice)
    切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。定义varidentifier[]typevarslice1[]type=make([]type,len)slice1:=make([]type,len)make([]T,length,capacity)len()和cap()函数packagemainimport"fmt"funcmain(){varnumbers=......
  • 2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符
    2023-08-14:用go语言写算法。给出两个长度相同的字符串str1和str2,请你帮忙判断字符串str1能不能在零次或多次转化后变成字符串str2,每一次转化时,你可以将str1中出现的所有相同字母变成其他任何小写英文字母,只有在字符串str1能够通过上述方式顺利转化为字符串......