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 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。