在 Go 语言里,把 array 类型的值当作函数实参传入时,究竟是按引用传递还是按值传递?
考察说明
考查对 Go 语言数组作为函数参数传递方式的理解。
回答思路
- 【回答框架 1】在 Go 语言中,array 类型的值作为函数参数是值传递。这意味着当把数组传递给函数时,函数会接收到数组的一个副本,而不是对原数组的引用。
- 【回答框架 2】函数内部对数组副本的修改不会影响调用者原本的数组,因为两者在内存中是独立的。
- 【回答框架 3】如果想在函数内修改原数组,可以传递数组的指针(即 *[N]T),或者使用切片(slice),切片本身是引用类型,传递时底层数组会被共享。
- 【回答框架 4】数组作为值传递的代价与数组大小有关,大数组的复制会有性能开销,因此实际编程中更常使用切片来避免这种开销。
- 【关键点 1】array 在 Go 中是值类型,作为函数参数时是值传递。
- 【关键点 2】传递数组指针或切片可以实现在函数内修改原数据。
- 【关键点 3】使用切片可以避免大数组复制的性能开销。
- 【易错点 1】不要误以为数组是引用类型,Go 中只有 slice、map、channel 等是引用类型。
- 【易错点 2】不要混淆数组和切片,数组长度固定,切片长度可变。