go数据类型-数组

与PHP比较

  • go中数组是固定长度的
  • 元素必须是同一类型的数据集合
  • 声明的时候必须制定元素类型和数组长度

go中的数组可以理解为是PHP中的索引数组

声明方式

  • 数组类型: [N]T
  • 切片类型: []T
  • 映射类型: map[K]T

其中:

  • T可以任意类型.元素的类型必须是同一种类型

  • N必须为一个非负整数常量.指定了数组类型的长度

  • K必须为一个可比较类型.它指定了一个映射类型的键值烈性

    不可比较类型(不支持使用==和!=):

    • 切片类型
    • 映射类型
    • 函数类型
    • 任何包含有不可比较类型的字段的结构体类型和任何元素类型为不可比较类型的数组类型。

    其他均为可比较类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 数组类型
    [5]string
    [Size]int
    [16][]byte // 此数组类型的元素类型为一个切片类型:[]byte
    [100]Person // 此数组类型的元素类型为一个结构体类型:Person

    // 切片类型
    []bool
    []int64
    []map[int]bool // 此切片类型的元素类型为一个映射类型:map[int]bool
    []*int // 此切片类型的元素类型为一个指针类型:*int

    // 映射类型
    map[string]int
    map[int]bool
    map[int16][6]string // 此映射类型的元素类型为一个数组类型:[6]string
    map[bool][]string // 此映射类型的元素类型为一个切片类型:[]string
    map[struct{x int}]*int8 // 此映射类型的元素类型为一个指针类型:*int8,
    // 它的键值类型为一个结构体类型。

    因为go中数组属于值类型,也可以通过new进行初始化new[5]int

一维数组和多维数组

go中的数组和PHP一样可以定义一维数组,和多维数组

访问数组

1
2
3
4
5
6
7
8
9
func main()  {
//读取
arr := [5]int{1,2,3,4,5} //[1 2 3 4 5]
fmt.Println(arr[0]) // 1
fmt.Println(arr[1]) // 2
//数组为可变类型,可以动态设置/更改值
arr[0] = 100
fmt.Println(arr[0])
}

遍历数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
func main()  {
for i:= 0; i < len(arr) ; i++ {
fmt.Printf("key is %d,value is %d \n",i,arr[i])
//key is 0,value is 1
//key is 1,value is 2
//key is 2,value is 3
//key is 3,value is 4
//key is 4,value is 5
}

//关键range遍历 有点类似PHP中的foreach
for i,v := range arr {
fmt.Printf("key is %d,value is %d \n",i,v)
//key is 0,value is 1
//key is 1,value is 2
//key is 2,value is 3
//key is 3,value is 4
//key is 4,value is 5
}

//不想获取索引
for _,v := range arr{
fmt.Println(v)
//1
//2
//3
//4
//5
}

//只获取索引
for i:=range arr{
fmt.Println(i)
//0
//1
//2
//3
//4
}
}

代码实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var multi [9][9]string
for j := 0; j < 9; j++ {
for i := 0; i < 9; i++ {
n1 := i + 1
n2 := j + 1
if n1 < n2 { // 摒除重复的记录
continue
}
multi[i][j] = fmt.Sprintf("%dx%d=%d", n2, n1, n1 * n2)
//fmt.Println(multi)
}
}
//fmt.Println(multi)

for _,v := range multi {
for _,v2 := range v {
fmt.Printf("%-8s",v2)
}
fmt.Println()
}
//1x1=1
//1x2=2 2x2=4
//1x3=3 2x3=6 3x3=9
//1x4=4 2x4=8 3x4=12 4x4=16
//1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
//1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
//1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
//1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
//1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81