Golang打印一个结构体结果是一个整型?

烧麦
  • 212

看到一段代码:

func main() {
    var age interface{} = 25

    t := reflect.TypeOf(age)
    v := reflect.ValueOf(age)

    fmt.Println(t, v) //int  25

    fmt.Printf("%T---%v\n", t, t) //*reflect.rtype---int
    fmt.Printf("%T---%v\n", v, v) //reflect.Value---25
}

这边有几个问题:
(1)Value结构体是不是实现了Type接口。
(2)为什么打印fmt.Println(t,v)结果是int 25,t,v不是一个是接口一个是结构体吗?直接打印一个结构体值是25?有点不懂
【结果写在注释里面,这里边我对t,v的类型不理解。比如reflect.ValueOf我看了源码,它应该返回一个Value结构体,那么v就是一个结构体,打印一个结构体fmt.Println(v)的结果25,这个怎么理解,你说打印一个int类型值是25我理解,直接这样打印一个结构体也是一个int值?】

回复
阅读 916
3 个回答
fefe
  • 13k

fmt:

Except when printed using the verbs %T and %p, special formatting considerations apply for operands that implement certain interfaces. In order of application:

  1. If the operand is a reflect.Value, the operand is replaced by the concrete value that it holds, and printing continues with the next rule.
  2. .......

fmt 的 print 系列函数对 reflect.Value 有特殊处理。

因为reflect.ValueOf,reflect.TypeOf都有一个方法是String()
这个是fmt的fmt.Stringer接口的函数签名 所以fmt.Println会直接执行String()的结果

go会自己推导数据类型, 而且interface 不是结构体, 只是一个接口可以用于接受任意类型的值,而reflect会反射原始的类型, 你说的println打印结构体却输出的结果值问题是实现了String 方法, 只要实现的String方法那么print就会返回String方法的值
如:

type System struct {}

func (config System) String() string {
    b, _ := json.MarshalIndent(config, "", "\t")
    return string(b)
}

只要打印这个System的实例就会输出json

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