Go中的数组是值类型,而不是引用类型。这意味着当它们被赋值给一个新变量时,会创建一个原始数组的副本赋值给新变量。
如果对新变量进行更改,不会影响原始数组。
package main
import "fmt"
func main() {
a := [...]string{"USA", "China", "India", "Germany", "France"}
b := a // a的一个副本被分配给b
b[0] = "Singapore"
fmt.Println("a is ", a)
fmt.Println("b is ", b)
}
在上面的程序中,数组a
的一个副本被分配给b
。然后,b
的第一个元素改为Singapore
。这不会影响原始数组a
。
程序将输出:
a is [USA China India Germany France]
b is [Singapore China India Germany France]
类似地,当数组作为参数传递给函数时,它们按值传递,而原始数组不变。
package main
import "fmt"
func changeLocal(num [5]int) {
num[0] = 55
fmt.Println("inside function ", num)
}
func main() {
num := [...]int{5, 6, 7, 8, 8}
fmt.Println("before passing to function ", num)
changeLocal(num) //num是通过值传递的
fmt.Println("after passing to function ", num)
}
数组num
是通过值传递给函数changeLocal
的,因此不会因为函数调用而更改原来的数组值。
这个程序将输出,
before passing to function [5 6 7 8 8]
inside function [55 6 7 8 8]
after passing to function [5 6 7 8 8]