ica10888
2020-05-19 18:57:21 +08:00
前面没解释清楚,我这里详细说一下
array 和 slice 是两个完全不一样的东西,slice 的底层实现类似 ArrayList,是用到了 array 数组的拷贝,扩容生成一个新数组
另外,如果理解了这道经典题的输出的迷惑行为,就大概知道 slice 是什么了
func main() {
s := []int{5}
fmt.Println(cap(s)) //1
s = append(s, 7)
fmt.Println(cap(s)) //2
s = append(s, 9)
fmt.Println(cap(s)) //4
x := append(s, 11)
y := append(s, 12)
fmt.Println(s, x, y) //[5 7 9] [5 7 9 12] [5 7 9 12]
}
x,y 都指向同一个 slice,ops,引用类型
这里和引用类型和值类型没啥关系,和指针也没啥关系,数组本来就应该是值类型的,而 slice 又和数组长得一模一样
至于 slice 为什么和数组用一套语法,就在于 golang 语言没法像 java 那样写出 ArrayList<String>这样来约束类型了,不知道是谁的主意,直接在语法层面解决了这一问题,关键是还和数组用同一套,就是因为没有泛型写不出一个 ArrayList 的类出来,同理还有 map
于是就有一堆这样的迷惑行为产生了,(后面引战话我删了,逃