Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了nil slice作为接口传递时不是零!为什么? (golang)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
看到这个游乐场: http://play.golang.org/p/nWHmlw1W01
package main

import "fmt"

func main() {
    var i []int = nil
    yes(i) // output: true
    no(i)  // output: false
}

func yes(thing []int) {
    fmt.Println(thing == nil)
}

func no(thing interface{}) {
    fmt.Println(thing == nil)
}

为什么两个函数间的输出差异?

不可否认,这有些怪癖,但有一个解释.

想象一个interface {}变量作为由两个字段组成的结构:一个是类型,另一个是数据. ([] int和nil).实际上,它在Go运行时看起来就像那样.

struct Iface                                                                                                                   
{                                                                                                                              
    Itab*   tab;                                                                                                               
    void*   data;                                                                                                              
};

当你将nil切片传递给yes时,只有nil作为值传递,所以你的比较可以归结为nil == nil.

同时,调用no会自动将变量包装在interface {}类型中,并且调用变为类似于no(interface {[] int,nil}).所以no中的比较可以看作是接口{[] int,nil} == nil,在go中结果是假的.

这个问题实际上是在the Go FAQ中解释的.

大佬总结

以上是大佬教程为你收集整理的nil slice作为接口传递时不是零!为什么? (golang)全部内容,希望文章能够帮你解决nil slice作为接口传递时不是零!为什么? (golang)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。