目录

数组

数组是具有相同数据类型的一组已编号且长度固定的数据项序列,可以是任意的原始数据类型也可以是自定义的数据类型。数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推。

Go 语言编程 — 高级数据类型 — 数组_Golang

定义数组

Golang 数组声明需要指定元素类型及元素个数,使用中括号 [] 来进行声明,格式如下:

// 声明
var variable_name[SIZE] variable_type

// 初始化
var balance = [5]float32 {1000.0, 2.0, 3.4, 7.0, 50.0}

示例:

package main

import "fmt"

func main() {
    var balance[5] int
    balance = [5]int {1000, 2, 3, 17, 50}
    // 或者简写为:
    // var balance = [5]int {1000, 2, 3, 17, 50}
    for i := 0; i < 5; i++ {
        fmt.Println(balance[i])
    }
}

注意,初始化数组中 {} 中的元素个数不能大于 [] 中的数字。

数组与切片的区别

Golang 只是省略指定元素的个数,使用 [...][] 来表示,创建一个特殊的 “数组”,编译器会根据元素的个数来设置 “数组” 的大小。需要注意的是,当我们不指定元素个数的时候,实际上创建的是切片数据类型,而非数组,因为 Golang 中定义的数组,其长度总是固定的。

var balance = [...] float32 {1000.0, 2.0, 3.4, 7.0, 50.0}
// or
var balance = []float32 {1000.0, 2.0, 3.4, 7.0, 50.0}
访问数组元素

数组元素可以通过索引(位置)来读取。格式为数组名后加中括号,中括号中为索引的值。例如:

  • 更改指定元素的数值:
balance[4] = 50.0
  • 读取指定元素的数值:
var salary float32 = balance[9]

示例:

package main

import "fmt"

func main() {
    var n[10] int

    for i := 0; i < 10; i++ {
        n[i] = i + 100
    }

    for j := 0; j < 10; j++ {
        fmt.Printf("Element[%d] = %d\n", j, n[j])
    }
}

结果:

Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
多维数组

多维数组定义格式:

var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type

二维数组是常见的多维数组类型,定义方式如下:

var arrayName[][] variable_type

Go 语言编程 — 高级数据类型 — 数组_Golang_02

初始化二维数组

a = [3][4]int { 
    {0, 1, 2, 3} ,    /* 第一行索引为 0 */
    {4, 5, 6, 7} ,    /* 第二行索引为 1 */
    {8, 9, 10, 11},   /* 第三行索引为 2 */
}

访问二维数组

二维数组通过指定坐标来访问。如数组中的行索引与列索引,例如:

val := a[2][3]
// or
var value int = a[2][3]

示例:

package main

import "fmt"

func main() {
    var a = [5][2]int{
        {0, 0},
        {1, 2},
        {2, 4},
        {3, 6},
        {4, 8},    // 注意这里必须要加上逗号 ”,“,因为 Golang 编译器会自动补全 ”;“ 号。
    }

    for  i := 0; i < 5; i++ {
        for j := 0; j < 2; j++ {
            fmt.Printf("a[%d][%d] = %d\n", i,j, a[i][j] )
        }
    }
}
向函数传递数组

如果想向函数传递数组实参,就需要在函数声明时,声明形参为数组类型。

  1. 形参设定数组大小:
void myFunction(param[10] int)
  1. 形参未设定数组大小:
void myFunction(param[] int)

同样的,向函数传递数组也有两种方式:

  1. 值传递:直接传递数组变量名。
  2. 引用传递:传递数据的指针。

示例:

package main

import "fmt"

func change(arr[5] int) {
    arr[0] = 1
    for i :=0; i < 5; i++ {
        fmt.Println(arr[i])
    }

    fmt.Println("--------")
}

func main() {
    var balance = [5]int {1000, 2, 3, 17, 50}

    change(balance)

    for i :=0; i < 5; i++ {
        fmt.Println(balance[i])
    }
}

结果:

1
2
3
17
50
--------
1000
2
3
17
50
指针数组

指针数组,即存储指针的数组,跟 C 语言中的指针数组类似。

声明一个整型指针数组:

var ptr[MAX] *int;

示例:

package main

import "fmt"

const MAX int = 3

func main() {
    var i int
    a := [MAX]int {10, 100, 200}
    var ptr[MAX] *int;

    for  i = 0; i < MAX; i++ {
        ptr[i] = &a[i]    /* 将整数的地址赋值给指针数组 */
    }

    for  i = 0; i < MAX; i++ {
       fmt.Printf("a[%d] = %d\n", i, *ptr[i])
    }
}