📢注意:slice 是引用传递 ,传递过去的参数,内存没有重新分配。
示例
package main
import "fmt"
// 引用传递 ,传递过去的地址,内存没有重新分配
func test(abc []int) {
abc[0] = -1
}
func main() {
s := make([]int, 0, 2)
s = append(s, 1) // [1]
test(s)
fmt.Println(s)
}
输出: [-1]
问题
一道经典题目,下面会输出什么呢。
package main
import "fmt"
func change(abc []int) {
abc = append(abc, 4)
for i := range abc {
abc[i] = 4
}
fmt.Println(abc)
}
func main() {
abc := []int{1, 2, 3}
abc = append(abc, 4)
change(abc)
fmt.Println(abc)
}
输出结果
[4 4 4 4 4]
[4 4 4 4]
没有答对的小伙伴,可以同时参考这篇 【Go - MD太可怕了,小心! Go中Slice的append陷阱】
关键点
- append 空间不足时,会重新分配空间;空间充足时,则不会重新分配
- 切片类型的值传递
- 切片的数据结构