Bootstrap

【Go - 小心! Go中slice的传递陷阱 】

📢注意: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 空间不足时,会重新分配空间;空间充足时,则不会重新分配
  • 切片类型的值传递
  • 切片的数据结构
;