Go 数组

数组 Array

  • 定义数组的格式:var <varName> [n]<type,n> = 0
  • 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型
  • 注意区分指向数组的指针和指针数组
  • 数组在Go中为值类型
  • 数组之间可以使用==或者!=进行比较,但是不可以使用>或者<
  • 可以使用new来创建数组,此方法返回一个指向数组的指针
  • Go支持多维数组

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func arrF1() {
var a [2]int
fmt.Println(a)

// 简写
a1 := [2]int{}
fmt.Println(a1)

a2 := [2]int{1}
fmt.Println(a2)

a3 := [2]int{1, 2}
fmt.Println(a3)
}

输出

1
2
3
4
[0 0]
[0 0]
[1 0]
[1 2]

如果字面值不够,会用0值来补充剩余的元素

索引赋值

前4个数字为0,最后一个数字为1

1
2
a4 := [5]int{4: 1}
fmt.Println(a4)

输出

1
[0 0 0 0 1]

在知道具体元素的情况下,也可以不声明数组长度

1
2
a5 := [...]int{1, 2, 3, 4, 5}
fmt.Println(a5)

输出

1
[1 2 3 4 5]

或者根据索引进行赋值,输出同上

1
2
a6 := [...]int{0: 1, 1: 2, 2: 3, 3: 4, 4: 5}
fmt.Println(a6)

前一位为索引,后一位为值

对于a4 := [5]int{4: 1}也可以使用另外一种写法,不指定数组长度

1
2
a7 := [...]int{4: 1}
fmt.Println(a7)

输出

1
[0 0 0 0 1]

指向数组的指针和指针数组

指向数组的指针

1
2
3
a7 := [...]int{4: 1}	
var p *[5]int = &a7
fmt.Println(p)

输出

1
&[0 0 0 0 1]

即 p 指针是数组[0 0 0 0 1]的地址

指针数组

1
2
3
x, y := 1, 2
a8 := [...]*int{&x, &y}
fmt.Println(a8)

输出:

1
[0xc00001a178 0xc00001a180]

数组在Go中为值类型

在其他语言中,数组为引用类型,在Go中为值类型,当函数中数组参数时

1
2
3
func test(arr1){ 
// 是将数组的值进行了copy,而不是传递地址给函数
}

数组比较

数组类型要相同,长度一样

1
2
3
a9 := [...]int{1, 2}
a10 := [...]int{3, 4}
fmt.Println(a9 == a10)

输出

1
false

new 关键字

1
2
p2 := new([10]int)
fmt.Println(p2)

输出

1
&[0 0 0 0 0 0 0 0 0 0]

指向数组的指针。

都可以使用下标的方式去修改数组

1
2
3
4
5
6
a := [10]int{}
a[1] = 2
fmt.Println(a)
p2 := new([10]int)
p2[1] = 2
fmt.Println(p2)

输出

1
2
[0 2 0 0 0 0 0 0 0 0]
&[0 2 0 0 0 0 0 0 0 0]

多维数组

1
2
3
4
5
6
7
func arrF2() {
a := [2][3]int{
{1, 1, 1},
{2, 2, 2},
}
fmt.Println(a)
}

输出

1
[[1 1 1] [2 2 2]]

索引赋值

1
2
3
4
5
6
7
func arrF2() {
a := [2][3]int{
{1:3},
{0:4},
}
fmt.Println(a)
}

输出

1
[[0 3 0] [4 0 0]]

但是与一维不同的是,不能用[...]

冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
func popF(){
a := [...]int{5,2,6,3,9}
fmt.Println(a)
num := len(a)
for i:= 0 ; i<num ; i++{
for j := i + 1 ; j <num ; j++ {
if a[i] < a[j] {
a[i],a[j] = a[j],a[i]
}
}
}
fmt.Println(a)
}
- the End -
0%