本文内容纲要:

- 数组定义

- 长度未知的数组的定义

- 指定数组索引值初始化数组

- 多维数组

- 遍历数组

- 数组是值类型

数组定义

Go 语言中定义数组的格式如下:

var 数组名称 [数组长度]数组每一项数据的类型

比如要定义一个长度为 3 的整数类型数组:

var arr [3]int
[3]int[5]int
0''false
func main() {
	var arr1 [3]int
	var arr2 [3]float64
	var arr3 [3]string
	var arr4 [3]bool

	fmt.Println(arr1) // [0 0 0]
	fmt.Println(arr2) // [0 0 0]
	fmt.Println(arr3) // [     ]
	fmt.Println(arr4) // [false false false]
}
{}[]
func main() {
	var arr1 [3]int
	arr1 = [3]int{1, 2, 3}

	var arr2 [3]string
	arr2 = [3]string{"go", "java", "javascript"}

	fmt.Println(arr1) // [1 2 3]
	fmt.Println(arr2) // [go java javascript]
}
[],

数组可以定义和赋值一起写,即:

func main() {
	arr1 := [3]int{1, 2, 3}

	arr2 := [3]string{"go", "java", "javascript"}

	fmt.Println(arr1) // [1,2,3]
	fmt.Println(arr2) // [go java javascript]
}

这样代码更简洁。

长度未知的数组的定义

...
func main() {
	arr1 := [...]int{1, 2, 3}

	fmt.Println(arr1) // [1 2 3]
	fmt.Printf("%T", arr1) // %T 表示打印值类型,数组 arr1 的类型是 [3]int
}
...

指定数组索引值初始化数组

len-1
func main() {
	arr := [3]int{3, 6, 9}
	fmt.Print(arr[1]) // 6
}

而在数组初始化时,也可以使用索引来指定值,比如:

func main() {
	arr := [...]int{2, 3: 1}
	fmt.Print(arr) // [2 0 0 1]
}
210
arr := [3]int{2, 3: 1} // error: array index 3 out of bounds

指定数组的长度是 3,但是索引最大也是 3,此时数组应该长度应该是 4,所以报错了。

多维数组

Go 语言支持多维数组,这里以二维数组为例。

定义二维数组例子:

func main() {
	arr := [3][2]string{
		{"北京", "上海"},
		{"杭州", "南京"},
		{"广州", "深圳"},
	}

	fmt.Println(arr) // [[北京 上海] [杭州 南京] [广州 深圳]]
	fmt.Printf("%T", arr) // [3][2]string
	fmt.Println(arr[1][1])  // 南京
}
[3][2]string[2]string{}[]
...
// ... 使用在外层可以自动推断二维数组的长度
arr := [...][2]string{
	{"北京", "上海"},
	{"杭州", "南京"},
	{"广州", "深圳"},
}

// 下面这样 ... 使用在内层是错误的
arr := [3][...]string{
	{"北京", "上海"},
	{"杭州", "南京"},
	{"广州", "深圳"},
}

遍历数组

forrange
for
// 遍历一维数组
func main() {
	arr := [3]string{"Golang", "Java", "JavaScript"}

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

// 输出
Golang
Java
JavaScript


// 遍历二维数组
func main() {
	arr := [2][3]string{
		{"Golang", "Java", "JavaScript"},
		{"Python", "PHP", "C"},
	}

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

// 输出
[Golang Java JavaScript]
[Python PHP C]
range
// 遍历一维数组
func main() {
	arr := [3]string{"Golang", "Java", "JavaScript"}

	for idx, val := range arr {
		fmt.Println(idx, val)
	}
}

// 输出索引和值
0 Golang
1 Java
2 JavaScript


// 遍历二维数组
func main() {
	arr := [2][3]string{
		{"Golang", "Java", "JavaScript"},
		{"Python", "PHP", "C"},
	}

	for _, val := range arr {  // 当我们要忽略索引值时,可以使用 _
		fmt.Println(val)
	}
}

// 输出
[Golang Java JavaScript]
[Python PHP C]

数组是值类型

不得不说一嘴,Go 语言中的数组是值类型,这跟 js 这种动态语言中的数组很不一样,在接触 Go 语言之前,我一直坚信数组就是引用类型,但现在要习惯不同编程语言的特性。

值类型和引用类型的代码区别就是,当修改复制出来的数据时,会不会改变原数据,如下代码证明了 Go 中的数组是值类型:

func main() {
	nums := [3]int{3, 5, 7}

	copy_nums := nums  // 复制数组

	copy_nums[0] = 4  // 修改复制数组的值

	fmt.Println(nums) // [3 5 7]
	fmt.Println(copy_nums) // [4 5 7]
}
nums[4 5 7]

本文内容总结:数组定义,长度未知的数组的定义,指定数组索引值初始化数组,多维数组,遍历数组,数组是值类型,