Go语法——数组
go语言数组用法介绍,go语言中数组其实用的非常少,因为它有非常灵活的切片,这种灵活度甚至超过了python的切片,所以go语言的绝大部分数组操作基本由切片完成,所以我们仅需要简单了解一下go语言简单的数组用法
基本定义
你会看到集中常见的数组定义方法:
var arr1 [5]int // 整形数组
arr2 := [3]int{1, 3, 5} // 同时赋值版本
arr3 := [...]int{2, 4, 6, 8, 10} // 不定长版本
var grid [4][5]bool // 二维布尔类型版本
...
不知道你们还记得不,不定参数的意思,可以输入任意长度的参数,在这里是让编辑器自动判断数组有几个数
也有这样定义的
var cheeses = make([]string, 2)
# make生成string类型的,长度为2的空数组
赋值
和常用的语言赋值操作没啥区别,go语言数组有很独特的切片,这种方式在后面会提到
var arr1 [5]int
arr1[0] = 1
遍历
学习过python的同学对内置函数range
肯定不陌生,熟练的便能写出如下代码:
a = [1,2,3,4,5,6]
for i in range(a):
...
前面有提到,go语言的函数可以拥有多个返回值,这种特性在go语言的range
函数中也不行例外,在go语言中的range
具体用法如下
var arr [...]int{1,2,3,4,5}
for i, v := range arr {
fmt.Println(i, v)
}
在这里,range对数组arr进行遍历,同时返回两个值,i
表示现在遍历到的数组下标,v
表示这个下标上数组中的值,一个代表位置,一个代表具体的数
这样就没有了普通循环遍历中使用arr[i]来获取对应数组位置上的数值的语句
但例外的是,前面提到对go语言中函数多个返回值若只想要其中一个,则其他的返回值位置要使用_
占位,
在这里,如果我只想要数组下标,可以直接写成:
var arr [...]int{1,2,3,4,5}
for i:= range arr {
fmt.Println(i)
}
如果要数值则需要老老实实的把i
替换成_
类型的讨论
对go语言,其数组是值类型的
证明如下
package main
import "fmt"
func printArray(arr [5]int) {
arr[0] = 100
for i, v := range arr {
fmt.Println(i, v)
}
}
func main() {
var arr1 [5]int{2,4,6,8,10}
fmt.Println("printArray(arr1)")
printArray(arr1)
fmt.Println(arr1)
}
上述程序大家可以跑一跑,输出如下:
printArray(arr1)
0 100
1 4
2 6
3 8
4 10
[2 4 6 8 10]
可以观察到,在函数printArray中arr[0]的值被修改为100,但是在main里面,arr[0]
这个位置上依旧是2
因为go语言在数组传递中是将数组拷贝传递过去,相当于一份副本被传递,当然,也是可以修改的,这就要使用到指针
package main
import "fmt"
func printArray(arr *[5]int) {
arr[0] = 100
for i, v := range arr {
fmt.Println(i, v)
}
}
func main() {
var arr1 [5]int{2,4,6,8,10}
fmt.Println("printArray(arr1)")
printArray(&arr1)
fmt.Println(arr1)
}
输出如下:
printArray(arr1)
0 100
1 4
2 6
3 8
4 10
[100 4 6 8 10]
最后,总结一句,go语言中一般很少直接使用数组,除非必须使用,基本使用切片来代替,下次我们会具体介绍go语言的切片