Golang|02 内建容器
1.数组
var arr1 [5]int // 声明数组
arr2 := [3]int{1, 3, 5} // 声明数组并赋值
arr3 := [...]int{2, 4, 6, 8, 10} // 不输入数组长度,让编译器来计算长度
var grid [4][5]int // 二维数组
- 数量写在类型前
- 可通过
_来省略变量,不仅仅是range,任何地方都可通过_来省略变量
sum := 0
for _, v := range numbers {
sum += v
}
- 如果只要下标
i,可写成for i := range numbers - 为人么要用
range? 因为意义明确、美观,c++:没有类似能力,Java/Python:只能for each value,不能同时获取i, v - 数组是值类型
[10]int和[20]int是不同类型- 调用
func f(arr [10]int)会 拷贝 数组 - 在 go 语言中一般不直接使用数组(指针),使用切片
2.切片
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s := arr[2:6]
s 就是一个切片,值为[2 3 4 5]
Slice本身没有数据,是对底层array的一个view
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s := arr[2:6]
s[0] = 10
arr 的值变为 [0 1 10 3 4 5 6 7]
- Reslice
s := arr[2:6]
s = s[:3]
s = s[1:]
s = arr[:]
- Slice 的扩展
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6]
s2 := s1[3:5]
s1的值为?s2的值为? s1的值为[2 3 4 5],s2的值为[5 6]
- slice 可以向后扩展,不可以向前扩展 s[i]不可以超越 len(s),向后扩展不可以超越底层数组 cap(s) 向 Slice 添加元素
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6]
s2 := s1[3:5]
s3 := append(s2, 10)
s4 := append(s3, 11)
s5 := append(s4, 12)
s3, s4, s5的值为?arr 的值为? 添加元素时如果超越 cap,系统会重新分配更大的底层数组.由于值传递的关系,必须接收 append 的返回值
s = append(s, val)
3.map
map的内部实现是hash table, 声明方式:map[KeyType]ValueType。除slice, map, function外的内建类型都可以作为key, 如果key使用了Struct 类型, 那么Struct 类型中如果不包含上述字段,也可作为key。
key 不存在时,获得Value 类型的初始值(Zero value),可以使用 value, ok := m[key]来判断是否存在 key,使用 delete 删除一个 key。
// 定义一个map
m := map[string] string {
"name": "ccmouse",
"course": "golang",
"site": "imooc",
"quality": "notbad",
}
m2 := map[string]map[int]string //map可以作为map的value
var m3 map[int]string //声明一个map, nil
m3[1] = "123" //错误,因为此时m3是nil
m4 := make(map[string] int) //声明一个map, empty map
for k, v := range m {
fmt.Println(k, v)
}
map 的遍历和slice一样,使用 range 遍历 key,或者遍历 key, value 对, 注意遍历map不能保证遍历的顺序(hash table),如需顺序,需手动对 key 排序。使用 len() 获取元素个数
4.字符串
rune相当于go语言的char- 使用
range遍历pos, rune对 - 使用
utf8.RuneCountInString获得字符数量 - 使用
len获得字节长度 - 使用
[]byte获得字节 - 其它字符串操作 Fields, Split, Join Contains, Index ToLower, ToUpper Trim, TrimRight, TrimLeft
- 原文作者:Binean
- 原文链接:https://bzhou830.github.io/post/20180503Go%E5%86%85%E5%BB%BA%E5%AE%B9%E5%99%A8/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。