4数组、切片和map
4.1数组
- 数组可以存放多个同一类型的数据。
- Go中不允许可变大小的数组,也不允许使用变量作为数组大小。如有需求,需要使用切片。
- 声明数组
- var 数组名 [数组大小]数据类型
- //数组元素为零值
- var 数组名 [数组大小]数据类型 = [数组大小]int{数组元素1,数组元素2,数组元素3,...}
- var 数组名 = [数组大小]int {数组元素1,数组元素2,数组元素3,...}
- var 数组名 = []int {数组元素1,数组元素2,数组元素3,...}
- var 数组名 = [数组大小]int {下标1:数组元素1,下标2:数组元素2,下标1:数组元素3,...}
- //指定下标元素
- var 数组名 = []int {下标1:数组元素1,下标2:数组元素2,下标1:数组元素3,...}
- var 数组名 [数组大小]数据类型
- eg
var a [5]int
a[4] = 100
fmt.Println("get:", a[2])
fmt.Println("len:", len(a))
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
4.2切片
-
slice切片是Go中特有的数组类型。
-
切片的使用类似数组。
-
切片是引用类型。进行值传递时,遵守引用传递机制。
-
切片的长度可变,切片是可以动态变化的数组。
-
声明切片
切片声明后必须引用数组或者使用make方法产生切片空间后才能使用。
-
var 切片名 []数据类型
- 切片名 := 数组名[索引1:索引2]
- //该切片引用该数组[索引1,索引2)范围的数据
- 切片名 := 数组名[索引1:]
- //该切片引用该数组[索引1,数组大小 - 1)范围的数据
- 切片名 := 数组名[:索引2]
- //该切片引用该数组[0,索引2)范围的数据
- 切片名 := 数组名[索引1:索引2]
- //该切片引用该数组[0,数组大小 - 1)范围的数据
- 切片名 := make([]数据类型, 长度大小, 容量大小)
- //使用make函数获得该长度大小该容量大小的切片
- 切片名 := make([]数据类型, 大小)
- //使用make函数获得长度和容量都是该大小的切片
- 切片名 := 数组名[索引1:索引2]
-
eg
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]
fmt.Println(s[2:5]) // [c d e]
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e f]
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
- 切片常用函数
- len(v) int:返回切片的长度(包含的元素数量)
- cap(v) int:返回切片的容量(能包含的最大元素数量)
- make(Type, IntegerType) Type:分配并初始化一个指定长度的切片
- make(Type, IntegerType, IntegerType) Type:返回一个指定长度、容量的切片
- append(slice []Type, ele Type...) slice:对切片进行动态追加。容量不足的场合会扩容。返回追加完毕后的新的切片
- copy(s []Type, o []Type):将 o 的数据拷贝(值拷贝)到 s。期间,s 的容量不变。s 容量更大时,多余位置保留原样。s 容量更小时,其余元素不保存。
4.3map
- map(映射)是key - value数据结构。key可以是slice、map、function外的类型,通常使用int或string。
- 切片是引用类型,遵守引用传递机制。
- map 的容量达到后,会自动扩容
- 声明map
- map的增删改查
- eg
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m) // map[one:1 two:2]
fmt.Println(len(m)) // 2
fmt.Println(m["one"]) // 1
fmt.Println(m["unknow"]) // 0
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
delete(m, "one")
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
fmt.Println(m2, m3)