- 今天看the-way-to-go,关于反射赋值时候一个疑问(11.10.2章节)
- 代码如下
package main
import (
"fmt"
"reflect"
)
func main() {
var x float64 = 3.14
v := reflect.ValueOf(x)
fmt.Println("settability of v:", v.CanSet())
fmt.Println("v.type:", v.Type()) //这一行输出v.type: float64
v = reflect.ValueOf(&x)
fmt.Println("type of v:", v.Type()) //这一行输出type of v: *float64
fmt.Println("settability of v:", v.CanSet())
v = v.Elem()
fmt.Println("the elem of v is:", v)
fmt.Println("settability of v:", v.CanSet())
v.SetFloat(3.1415)
fmt.Println(v.Interface())
fmt.Println(v)
}
其中 v := reflect.ValueOf(x)
中v的类型是float64,为何在v = reflect.ValueOf(&x)
之后v的类型是*float64后还能用=赋值,这样前后类型不一样为什么不会出错?
v的实际类型是reflect.Value,不是float64也不是*float64...注意区别v.(type)和v.Type()