gpt4 book ai didi

interface - Go 接口(interface)是 (type, nil) 或 (type , value)

转载 作者:IT王子 更新时间:2023-10-29 02:05:57 24 4
gpt4 key购买 nike

你好,我想问一个关于 interface is nil 的问题

//i think err should be a interface (*MyError, nil)
var err error = (*MyError)(nil)
fmt.Println(reflect.TypeOf(err))
fmt.Println(reflect.ValueOf(err))`

结果告诉我接口(interface)值不为零结果:

*main.MyError
<*main.MyError Value>

相当于接口(interface)(*main.MyError, <*main.MyError Value>)为什么接口(interface)值不是nil?

谢谢

最佳答案

这两个东西是完全不同的:

  • nil接口(interface)值。它不包含基础类型或值。

  • nil接口(interface)值,包含底层类型和值,底层值为 nil在该基础类型中(如果它是具有名为 nil 的值的类型之一——指针、 slice 、映射、 channel 或函数)。请注意,不同类型的 nil s 不同且不相关(pointer- nil 和 map- nil 不相关);并且某些类型没有名为 nil 的值.

你有一个 nil指针( *MyError 类型),并将其分配给接口(interface)变量(首先是接口(interface)类型 error ,然后转换为接口(interface)类型 interface{} ,这是 reflect.TypeOf()reflect.ValueOf() 的参数类型)。因此,这些函数收到非 nil。包含基础类型的接口(interface)值 *MyError和潜在值(value)nil .

reflect.TypeOf(err)获取基础类型,即 *MyError .和 reflect.ValueOf(err)构造一个 reflect.Value表示基础类型和值的对象。这就是您所看到的。

stringification of a reflect.Value 产生字符串 <T value> , 其中T是类型,但它不会尝试将值字符串化(在本例中为 nil 指针)。如果您想打印基础值,也许您应该刚刚完成 fmt.Println(err)相反。

关于interface - Go 接口(interface)是 (type, nil) 或 (type , value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25300573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com