下面这段代码输出什么?
func hello(num ...int) {
num[0] = 18
}
func main() {
i := []int{5, 6, 7}
hello(i...)
fmt.Println(i[0])
}
A.18 B.5 C.Compilation error
答 18
Go参数go只有值传递,函数调用每次都会创建一个新的副本,副本的值=原来的值。
…int 本质上是个切片。切片的结构是 cap lan 底层数组指针
因此 num ...int 和 i... 的值内容是相同的。但是变量地址是不通的。
题目中没有触发扩容,因此2个切片指向同一个底层数组,因此num[0] = 18 会影响到外面的 i[0]
在线运行:
本题: https://go.dev/play/p/ne8bmUzhqsN
num触发扩容后修改: https://go.dev/play/p/Y3BhAEj3CjL
copy深拷贝切片: https://go.dev/play/p/QZwRA6jL48z