数组就是指一系列同一类型元素的集合,数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度.
go语言常规数组的声明方法:
[16]byte //长度为16的数组,每个元素为一个字节
[2*N] struct { x, y int32} //复杂类型数组
[1000]*float64 //指针数组
[3][5]int //二维数组
go语言中,数组定义长度之后就不可以修改,在声明长度时可以为一个常量,或者是一个常量表达式(是指在编译期可计算结果的表达式),数组的长度是该数组类型的一个内置常量,使用非常简单比如:
arrayLength := len(array) //获取数组长度
直接使用数组下标来访问数组中的元素,下标从0开始, len(array)-1 可直接获取数组的最大下标,下面是遍历整个数组的例子:
array := [5]string{"zhangsan","lisi","wanger","xiaohong","xiaoming"}
for i :=0; i
go还提供了一个关键字为 range,用于便捷遍历容器中的元素,当然,数组也是 range 的支持范围,上面遍历过程可以简化为:
array := [5]string{"zhangsan","lisi","wanger","xiaohong","xiaoming"}
for i , v := range array {
fmt.Println("Array element[", i, "]=", v);
}
不难看出 range具有两个返回值,第一个返回值是元素的数组下标,第二个返回值是元素的值.
需要注意的是,在 go 中,数组是一个值类型,话句话说,就是数组是一个值传递,并不是应用传递,值传递在赋值或者当做参数进行传递是,仅仅是一个复制的动作. 因此,在函数体中修改传入的数组的内容,所修改的只是所传入的数组的一个副本.
例如:
func main(){
array := [5]string{"xiaohong","xiaoming","wanger","lisi","zhangsan"}
modify(array)
fmt.Println("In main(), array values:", array)
}
func modify(array [5]string){
array[0]="new_xiaoming"
fmt.Println("In modify(), array values:", array)
}
打印结果:
In modify(), array values: [new_xiaoming xiaoming wanger lisi zhangsan]
In main(), array values: [xiaohong xiaoming wanger lisi zhangsan]
执行结果不难看出,函数 modify() 中所执行的操作并没有影响 main() 函数中的数组.两个数组是不同的实例