将 Nil Slice 传递给 Interface:解开谜团
在 Go 中,nil slice 和 nil interface{} 值之间的区别可以导致意想不到的结果。考虑以下游乐场摘录:
<code class="go">package main import "fmt" func main() { var i []int = nil yes(i) // true no(i) // false } func yes(thing []int) { fmt.Println(thing == nil) } func no(thing interface{}) { fmt.Println(thing == nil) }</code>
为什么这些函数会产生不同的输出?
理解接口{}
接口{}变量类似于具有两个字段的结构:类型和数据。在这种情况下,它看起来像 {[]int (type), nil (data)}。
Nil Slice 与 Nil Interface
是的,nil slice 直接传递。比较检查 nil 是否等于 nil,其计算结果为 true。
在 no 中,nil 切片被包装在接口{}中,结果是 {[]int (type), nil (data)}。将此接口与 nil 进行比较,检查类型是否为 nil,但事实并非如此。因此,输出为 false。
差异的原因
此行为源于接口封装类型和值的事实。将接口与 nil 进行比较会检查 nil 类型,而比较基础数据值则不同。在 no 的情况下,类型不为 nil,因此比较返回 false。
结论
看似矛盾的行为是由于 nil 切片之间的细微差异造成的和零接口。理解这种区别对于避免在 Go 中使用接口时出现混淆至关重要。
以上是为什么将 nil 切片与 interface{} 进行比较会产生与直接将 nil 切片与 nil 进行比较会产生不同的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!