nil slice 和 empty slice 的区别

2020-02-07  本文已影响0人  ProgrammingGuy

在学习 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

上一篇下一篇

猜你喜欢

热点阅读