golang的反射引发出类型问题;

  1. 今天看the-way-to-go,关于反射赋值时候一个疑问(11.10.2章节)
  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后还能用=赋值,这样前后类型不一样为什么不会出错?

阅读 2.3k
2 个回答

v的实际类型是reflect.Value,不是float64也不是*float64...注意区别v.(type)和v.Type()

reflect.ValueOf的返回值是reflect.Value类型, reflect.Value类型是个普通的struct
源码在$GOROOT/src/reflect/value.go里面,定义这个结构用来描述go中所有的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题