go-数组

134 阅读2分钟

定义

  • 数组是具有相同 唯一类型 的一组已编号且 长度固定 的数据项序列

初始化

  • 数组的长度必须在声明时给出
  • 数组长度最大为2GB
    arr1 := [4]int{1, 2, 3, 4}  //指定长度和初始化字面量
    arr2 := [...]int{1, 2}  //通过初始化列表数量确定长度
    
    var arr5 [4]int
    arr5[1] = 2

相关操作

  • 访问 arr[i]
  • 更新数组元素 arr[i] = value
  • 遍历 for k,v := range arr {}
  • 长度 len(arr)

多维数组

  • 数组通常是一维的,但是可以用来组装成多维数组,例如:[3][5]int[2][2][2]float6

特点

  • 值拷贝:数组赋值或者作为函数参数都是值拷贝
  • 长度固定,不可以追加元素
  • 数组长度是数组类型的组成部分,如[5]int和[10]int是不同的类型

案例

数组当做参数传递时,是值拷贝

package main

import "fmt"

func f(a [3]int)   { a[1] = 10 }
func fp(a *[3]int) { a[1] = 10 }

func main() {
	var ar [3]int
        // 数组是值拷贝,所以函数内部的修改不影响全局变量
	f(ar)
	fmt.Println(ar) //[0 0 0]
        //使用地址传值,可以在函数内部修改全局变量
	fp(&ar)
	fmt.Println(ar) //[0 10 0]
}

数组在内存中的存储

  • 数组的地址就是数组第一个元素的地址
  • 数组的各个元素的地址间隔是依据数组的类型决定
//数组的地址
func arr_address() {
	points := [5]int{1, 4, 3, 2, 0}

	fmt.Printf("数组地址%p:", &points)
	fmt.Println("\n")

	for k, _ := range points {
		fmt.Printf("数组元素points[%d]地址%p:", k, &points[k])
		fmt.Println("\n")
	}
        /**
	* 数组地址0x11ca6078:

	* 数组元素points[0]地址0x11ca6078:

	* 数组元素points[1]地址0x11ca607c:

	* 数组元素points[2]地址0x11ca6080:

	* 数组元素points[3]地址0x11ca6084:

	* 数组元素points[4]地址0x11ca6088:
	**/
        
}