登录
首页 >  Golang >  Go问答

作为接口传递的零切片不是零!为什么?(戈朗)

来源:Golang技术栈

时间:2023-04-12 15:55:53 298浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《作为接口传递的零切片不是零!为什么?(戈朗)》,也希望能帮助到大家,如果阅读完后真的对你学习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{}为由两个字段组成的结构:一个是类型,另一个是数据。([]intnil)。实际上,它看起来就像在 Go 运行时中那样。

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

当您将 nil 切片传递给 时yes,仅nil作为值传递,因此您的比较归结为nil == nil.

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

这个问题实际上在Go FAQ中有解释。

终于介绍完啦!小伙伴们,这篇关于《作为接口传递的零切片不是零!为什么?(戈朗)》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表