我又来了,代码如下:
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了。![1.PNG](https://static.studygolang.com/220121/d33634b6c8ab52118d6a1769f70d6e84.PNG)![2.PNG](https://static.studygolang.com/220121/17d38940bd329784944abe3b2873603d.PNG)
#17
更多评论
明白了,s1相当于已经做一次初始化,已经分配内存了,就不等于nil
![ss.png](https://static.studygolang.com/220113/8c3b175899f50612f103041c2c9c94cf.png)
#1