跳到主要内容

函数参数

函数传参语义是什么, 如何修改调用方变量?​

  • 参数模型: Go 统一的值复制规则见类型系统;这里重点判断对参数的修改能否影响调用方;
  • 修改调用方变量: 需要传指针或传递引用底层数据的值;
func changeNumber(n int) {
n = 100 // 修改的是参数副本
}

func changeSlice(nums []int) {
nums[0] = 100 // 修改共享的底层数组
nums = append(nums, 2) // 只修改参数副本 nums,不改变调用方 slice 的长度
}

func main() {
n := 1
nums := []int{1}

changeNumber(n)
changeSlice(nums)

println(n) // 1
println(nums[0]) // 100
println(len(nums)) // 1
}

可变参数如何使用, 有哪些位置与类型规则?​

  • variadic parameter: 使用 ...T 接收任意数量参数;
  • 位置限制: 可变参数必须是最后一个参数;
  • 函数内部表示: 类型为 []T;
func sum(nums ...int) int { // nums 在函数内部表现为 []int
total := 0
for _, n := range nums {
total += n
}
return total
}
println(sum()) // 无实参时 nums 是 nil 切片,结果为 0
values := []int{1, 2, 3}
println(sum(values...)) // 用 ... 展开已有切片