我又来了,代码如下:
s1和s2 都是空切片,长度都为零,为何跟nil比较结果不一样呢?
package main
import "fmt"
func main() {
var s1 = []string{}
var s2 []string
fmt.Println(s1 == nil, s1, len(s1)) // 输出 false [] 0
fmt.Println(s2 == nil, s2, len(s2)) // 输出 true [] 0
}
我又来了,代码如下:
s1和s2 都是空切片,长度都为零,为何跟nil比较结果不一样呢?
package main
import "fmt"
func main() {
var s1 = []string{}
var s2 []string
fmt.Println(s1 == nil, s1, len(s1)) // 输出 false [] 0
fmt.Println(s2 == nil, s2, len(s2)) // 输出 true [] 0
}
首先,go的函数传参,返回都是拷贝。你可以把它理解成一个浅拷贝,而slice底层确实是结构体,函数修改的虽然是拷贝的数据,但是由于是浅拷贝,原来的slice和函数里的slice虽然不一样,但是共用同一个数组,只是通过下标修改值当然不会影响到底层的数组了啊!append扩容了之后,函数里面的slice绑定了一个新数组,当然不会影响到元slice了。