注:个人日志记录,如果有错误理解或者不足之处,请指出,谢谢~
func hello(num ...int) {
num[0] = 18
}
func main() {
i := []int{5, 6, 7}
hello(i...)
fmt.Println(i[0])
}
上述代码,执行结果为18
分析原因如下:
- 首先slice作为可变函数的参数时,需要使用 ... 的语法糖
- 在传递的时候,虽然实参i的地址与形参num的地址不同,但是其slice底层数组地址时相同的
- 由于底层数组地址相同,所以形式参数num修改时,i的内容也会被修改
package main
import (
"fmt"
"reflect"
)
func hello(num []int) {
fmt.Printf("地址:%p, 类型:%s\n", &num[0], reflect.TypeOf(num))
num[0] = 18
}
func main() {
i := []int{5, 6, 7}
fmt.Printf("地址:%p, 类型:%s\n", &i[0], reflect.TypeOf(i))
hello(i)
fmt.Println(i[0])
}
运行结果如下:
地址:0xc00001c090, 类型:[]int
地址:0xc00001c090, 类型:[]int
18