1. 数组
1.1 定义数组
定义一个长度为5的空数组(空数组的默认值为0):
var arr [5]int // [0,0,0,0,0]
定义一个长度为3的数组:
arr2 := [3]int{
1, 3, 5} // [1,3,5]
定义一个自设置长度的数组:
arr3 := [...]int{
2, 4, 6, 8, 10} // [2,4,6,8,10]
定义一个二维数组:
var grid [4][5]int // [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
1.2 遍历数组
常规的遍历方式:
for i := 0; i < len(arr3); i++ {
fmt.Println(arr3[i])
}
使用 range
获取索引值以及元素值:
for i,v := range arr3 {
fmt.Println(i, v) // i: 索引 v: 值
}
1.3 数组是值类型
func printArray(arr [5]int) {
// [5]int 是一种规定的类型,如果传入 [6]int 的数组就会报错
arr[0] = 100
for i, v := range arr {
fmt.Println(i, v)
}
}
func main(){
fmt.Println("调用函数输出:")
printArray(arr)
fmt.Println("调用原值:")
fmt.Println(arr)
}
输出结果:
调用函数输出:
0 100
1 0
2 0
3 0
4 0
调用原值:
[0 0 0 0 0]
可以看出,在 printArray
函数中,对传入的数组的第一个数值进行了修改,如果是Javascript等数组类型为引用类型的编程语言的话,实际上修改的是传入的数组。而Go语言中,由于数组是值类型的,在函数调用时对原数组进行了一层拷贝,所以在函数中更改的数组并不会影响到传入的原数组。
如果要想实现引用类型的用法,则使用指针可以实现:
func printArrayByPointer(arr *[5]int) {
arr[0] = 100
for i, v := range arr {
fmt.Println(i, v)
}
}
func main(){
// 使用指针传递数组
fmt.Println("调用函数输出:")
printArrayByPointer(&arr)
fmt.Println("调用原值:")
fmt.Println(arr)
}
2. 切片
2.1 定义切片
数组切片符合左开右闭原则
arr := [...]int{
0, 1, 2, 3, 4,