先看一个简单的数组定义:
var array [3]int
上面语句定义了变量array
,这个变量是一个包含3
个整数的数组类型。可以使用Go
语言内置的len
函数得到数组长度:
package main
import (
"fmt"
)
func main() {
var array [3]int
fmt.Println(len(array))
}
执行以上程序结果:
3
需要注意的是,在Go
语言中,数组的长度是数组类型的一部分,它必须是一个常量表达式,即长度的值在程序编译时是可以得到的。请看下面这个程序:
package main
import (
"fmt"
)
func print_array(array []int) {
fmt.Printf("In function, array is %v\n", array)
}
func main() {
var array [3]int
print_array(array )
}
编译这个程序会产生下面的错误:
main.go:14: cannot use array (type [3]int) as type []int in argument to print_array
Go
语言要求传入函数的形参和实参的类型必须是完全匹配的,而array
的类型是[3]int
,不是[]int
,所以编译会出错。
Go
语言函数参数都是传值调用,所以如果函数的参数是数组的话,那么实际传入的将是原数组的拷贝。请看这个例子:
package main
import (
"fmt"
)
func change_array(array [3]int) {
for i, _ := range array {
array[i] = 1
}
fmt.Printf("In function, array address is %p, value is %v\n", &array, array)
}
func main() {
var array [3]int
fmt.Printf("Original array address is %p, value is %v\n", &array, array)
change_array(array)
fmt.Printf("Changed array address is %p, value is %v\n", &array, array)
}
执行结果:
Original array address is 0xc082006560, value is [0 0 0]
In function, array address is 0xc0820065e0, value is [1 1 1]
Changed array address is 0xc082006560, value is [0 0 0]
可以看到,在change_array
函数中操作的数组地址并不是main
函数中的数组地址,而main
函数中的数组的值在调用change_array
函数前后也没有发生变化。
如果数组的元素类型是可比较的,那么数组类型就是可比较的,即可以使用“==
”和“!=
”运算符对数组进行运算。 请看下例:
package main
import "fmt"
func main() {
a := [...]int{2, 1}
b := [...]int{1, 2}
fmt.Println(a == b, a != b)
}
执行结果如下:
false true