开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:反射的练习题】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9772
反射的练习题
内容介绍
一、用反射得到 reflect.Value,并获取对应的 Type、Kind 和值,再将 reflect.Value 转化成 interface{},再将 interface{} 转化成 float64。
二、看段代码,判断是否正确,为什么
一、给一个变量 var v float64=1.2,请使用反射来得到它的 reflect.Value,然后获取对应的 Type、Kind 和值。并将 reflect.Value 转化成 interface{},再将 interface{} 转化成 float64。
对此不再说明,因为它和前面讲过的案例没有什么区别。ReflectTest01 其实就是完成了这样一个工作,只是当时做的是传了一个整数进去。这个题的要求是做成 float64,并没有什么需要注意的。
二、看段代码,判断是否正确,为什么
func main ()
var str string=〞Tom〝 //OK
fs:=reflect.ValueOf(string)//OK
fs.Setstring(〝jack〞)//error
Fmt.Printf(〝%v\n〞,str)
fs 的类型或者是类别都是 string,而这里是 Setstring,那么这句话就会报错。因为它在这里是要求用一个指针去 elem 然后再调用的。把这段代码放在练习里面。新建一个文件夹叫做练习,新建一个文件夹叫做 main.go。这段代码编译过后并没有报什么错误。
修改指令如下:
var str string=〞Tom〝 //OK
fs:=reflect.ValueOf(&str)//OK fs-string
fs.Elem().Setstring(〝jack〞)//OK
fmt.Printf(〝%v\n〞,str)//jack
第一个地方的调整就是要把传入的地方改成一个地址,改成地址以后用 fs.Elem 去取回这个 string 真正指向的那一个数据空间。
报错的原因其实是一样的。地址完了过后加一个Elem,这样就可以了。但是这样一做的话 error 就OK了。下面就会输出 Jack。代码就这样去进行一个改进。通过反射去改变值的时候是有要求的。