函数参数
函数传参语义是什么, 如何修改调用方变量?
- 参数模型: 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...)) // 用 ... 展开已有切片