美文网首页
nil slice 和 empty slice 的区别

nil slice 和 empty slice 的区别

作者: ProgrammingGuy | 来源:发表于2020-02-07 16:18 被阅读0次

    在学习 Go 切片的时候,发现官方例子与我的实验结果有出入,我本以为两种写法得到的结果是一样的,但是做了实验之后发现,虽然两种 slice 表现出的动作差不多,但是还是牵扯到理论问题。

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        s := []int{}
        var ss []int
    
        check("s", s)
        check("ss", ss)
    }
    
    func check(id string, s []int) {
        if s == nil {
            fmt.Println(id, "is nil")
        } else {
            fmt.Println(len(s), cap(s))
        }
    }
    
    

    运行结果:

    image.png

    可见,虽然二者的 cap 和 len 都为0,但是一个是 nil slice,而另一个是 non-nil slice。这是因为当一个 slice 没有初始化时(uninitialized),它就是 non-nil 的。s 使用了:=操作符,而:==的区别之一就是前者带了一次构建(construct)的操作,即初始化(initialize),所以 s 是一个已经初始化的 slice,而 ss 还没有初始化(和 C# List<T> list;之后并没有接new同理)。

    参考:https://stackoverflow.com/questions/30806931/the-zero-value-of-a-slice-is-not-nil

    相关文章

      网友评论

          本文标题:nil slice 和 empty slice 的区别

          本文链接:https://www.haomeiwen.com/subject/liomxhtx.html