本文内容纲要:
- 数组定义
- 长度未知的数组的定义
- 指定数组索引值初始化数组
- 多维数组
- 遍历数组
- 数组是值类型
数组定义
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]
本文内容总结:数组定义,长度未知的数组的定义,指定数组索引值初始化数组,多维数组,遍历数组,数组是值类型,