问题描述
1、在go语言中当函数的参数为数组或数组切片时,形参的方式应该怎么确定?
2、不同形式的实参和形参造成的结果有何不同(会否对原数组或切片内容产生改变)?
情况设定及结论
原内容(数组/切片) | 实参形式 | 形参形式 | 传递方式 | 在函数内对原内容操作结果 | 说明 |
---|---|---|---|---|---|
array := [5]int{1, 2, 3, 4, 5} | array | array [5]int | 值传递 | 原内容未改变 | 传入时复制了一个数组副本 |
array := [5]int{1, 2, 3, 4, 5} | array[0:] | array []int | (类似)引用传递 | 原内容可发生改变 | 传入时数组切片化了 |
array := []int{1, 2, 3, 4, 5} | array | array []int | 引用传递 | 原内容可发生改变 | 传入了切片的指针(注:经验证,二维切片同方法) |
相关代码
情况一:
package main
import "fmt"
func modify(array [5]int) {
array[0] = 10
fmt.Println("In modify(), array values:", array)
}
func main() {
array := [5]int{1, 2, 3, 4, 5} //这是一个数组
modify(array)
fmt.Println("In main(), array values:", array)
}
运行结果:
In modify(), array values: [10 2 3 4 5]
In main(), array values: [1 2 3 4 5]
情况二:
package main
import "fmt"
func modify(array []int) {
array[0] = 10
fmt.Println("In modify(), array values:", array)
}
func main() {
array := [5]int{1, 2, 3, 4, 5}
modify(array[0:])
fmt.Println("In main(), array values:", array)
}
运行结果:
In modify(), array values: [10 2 3 4 5]
In main(), array values: [10 2 3 4 5]
情况三:
package main
import "fmt"
func modify(array []int) {
array[0] = 10
fmt.Println("In modify(), array values:", array)
}
func main() {
array := []int{1, 2, 3, 4, 5}
modify(array)
fmt.Println("In main(), array values:", array)
}
运行结果:
In modify(), array values: [10 2 3 4 5]
In main(), array values: [10 2 3 4 5]
###脚注
生成一个脚注1.
目录
用 [TOC]
来生成目录:
这里是 脚注 的 内容. ↩︎