数组与切片
数组(array)
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成,一旦声明了,数组的长度就固定了,不能动态变化。
len() 和 cap() 返回结果始终一样。
声明数组
1 | // declareArr.go |
运行结果:
1 | PS D:\Project\godemo> go run declareArr.go |
注意事项
数组不可动态变化问题,一旦声明了,其长度就是固定的。
1
2
3var arr_1 = [5] int {1, 2, 3, 4, 5}
arr_1[5] = 6
fmt.Println(arr_1)运行会报错:invalid array index 5 (out of bounds for 5-element array)
数组是值类型问题,在函数中传递的时候是传递的值,如果传递数组很大,这对内存是很大开销。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// arrDemo1.go
package main
import (
"fmt"
)
func main() {
var arr = [5] int {1, 2, 3, 4, 5}
modifyArr(arr)
fmt.Println(arr)
}
func modifyArr(a [5] int) {
a[1] = 20
}运行结果:
1
2PS D:\Project\godemo> go run arrDemo1.go
[1 2 3 4 5]1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// arrDemo2.go
package main
import (
"fmt"
)
func main() {
var arr = [5] int {1, 2, 3, 4, 5}
modifyArr(&arr)
fmt.Println(arr)
}
func modifyArr(a *[5] int) {
a[1] = 20
}运行结果:
1
2PS D:\Project\godemo> go run arrDemo2.go
[1 20 3 4 5]数组赋值问题,同样类型的数组(长度一样且每个元素类型也一样)才可以相互赋值,反之不可以。
1
2
3var arr = [5] int {1, 2, 3, 4, 5}
var arr_1 [5] int = arr
var arr_2 [6] int = arr运行会报错:cannot use arr (type [5]int) as type [6]int in assignment
切片(slice)
切片是一种动态数组,比数组操作灵活,长度不是固定的,可以进行追加和删除。
len() 和 cap() 返回结果可相同和不同。
声明切片
1 | // declareSlice.go |
运行结果:
1 | PS D:\Project\godemo> go run declareSlice.go |
截取切片
1 | // cutSlice.go |
运行结果:
1 | PS D:\Project\godemo> go run cutSlice.go |
追加切片
1 | // addSlice.go |
运行结果:
1 | PS D:\Project\godemo> go run addSlice.go |
append 时,容量不够需要扩容时,cap 会翻倍。
删除切片
1 | // delSlice.go |
运行结果:
1 | PS D:\Project\godemo> go run delSlice.go |
Struct 结构体
结构体是将零个或多个任意类型的变量,组合在一起的聚合数据类型,也可以看做是数据的集合。
结构体的声明
1 | // structDemo.go |
运行结果:
1 | PS D:\Project\godemo> go run structDemo.go |
生成 JSON
1 | // structToJson.go |
运行结果:
1 | PS D:\Project\godemo> go run structToJson.go |
改变数据
1 | // changeStructData.go |
运行结果:
1 | PS D:\Project\godemo> go run changeStructData.go |
Map 集合
Map 集合是无序的 key-value 数据结构。
Map 集合中的 key / value 可以是任意类型,但所有的 key 必须属于同一数据类型,所有的 value 必须属于同一数据类型,key 和 value 的数据类型可以不相同。
Map 的声明
1 | // declareMap.go |
运行结果:
1 | PS D:\Project\godemo> go run declareMap.go |
生成 JSON
1 | // mapToJson.go |
运行结果:
1 | PS D:\Project\godemo> go run mapToJson.go |
编辑和删除
1 | // mapDemo.go |
运行结果:
1 | PS D:\Project\godemo> go run mapDemo.go |
