Go数据类型之复合数据类型(数组)

3.1数组

    数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。数组中每个元素类型相同,又是连续分配,因此可以以固定的速度索引数组中的任何数据,速度非常快。

3.1.1声明和初始化

1、使用字面量声明数组:

  array := [5]int{10, 20, 30, 40, 50}

2、自动计算声明数组的长度

  //容量由初始化值的数量来决定

  array := [...]int{10, 20, 30, 40, 50}

3、声明数组并指定特定元素的值

  array := [5]int{1: 10, 2: 20}

4、指针数组

  //声明包含5个元素的指向整数的数组,并用整型指针初始化索引为0和1的数组元素

  array := [5]*int{0: new(int), 1: new(int)}

3.1.2 使用数组

1、访问数组元素

  array := [5]int{10, 20, 30, 40, 50}

  array[2] = 35 //修改索引为2的元素的值

2、访问指针数组的元素

  array := [5]*int{0: new(int), 1: new(int)}

  *array[0] = 10

  *array[1] = 20

3、数组的长度是数组类型的一个组成部分,同一类型的数组才可以用”==”相互比较。

 a := [2]int{1, 2}
 b := [...]int{1, 2}
 c := [2]int{1, 3}
 fmt.Println(a == b, a == c, b == c) //"true false false"
 d := [3]int{1, 2}
 fmt.Println(a == d) //compile error: cannot compare [2]int == [3]int

3.1.3 在函数间传递数组

  在函数之间传递变量时,总是以值的方式传递的。如果这个变量是个数组,意味着整个数组都会完整的复制,并传递给函数。这就意味着对数组参数的任何修改都是发生在复制的数组上,并不能直接修改调用时原始的数组变量。

1、使用值传递,在函数间传递大数组
  每次foo被调用时,必须在栈上分配8M的内存,之后整个数组的值被复制到刚分配的内存里。

//声明一个8M大小的数组
var array [1e6]int
func foo(array [1e16]int) {
    ...
}
foo(arry) //将数组传递给函数foo 

2、使用指针在函数间传递大数组
  将数组的地址传入函数,只要在栈上分配4字节的内存给指针就可以。由于传递的是指针,所以如果改变指针指向的值,就会改变共享的内存。

var array [1e6]int

func foo(array *[1e16]int) {

      ...
 }
 foo(&arry) //将数组的地址传递给函数foo

猜你喜欢

转载自www.cnblogs.com/ralap7/p/9170548.html