注:本文搬运了一些我青训营期间听课的笔记(我一般直接用注释或者记笔记本上),不保证正确性,而且有些地方可能比较乱,大家看个乐就行了。
基础语法部分
map
map在其他语言中它叫哈希或者字典(python),是实际工作中最常用到的数据结构之一,由若干key/value对组成。
从第14行可以看出,在map中读取v值的时候,可以在后面加一个ok变量(bool),来确认map中是否有这个key存在,存在为true,不存在为false。
需要注意的是,map中元素的存储是无序的,遍历时不会按照插入顺序输出,也不会按照字母顺序输出,是随机顺序输出。也就是说,第21行输出结果中m2和m3的元素顺序可能是不一样的。
package main
import "fmt"
func main() {
m := make(map[string]int) // 创建一个map,里面有key和value
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)
}
range(包含一点点for知识点)
range可用于遍历slice或map。
对于slice,如果设置了两个返回参数,则分别返回index和value,如果不需要索引可以用下划线忽略(_, num);如果只有设置了一个参数,则返回value,因为就返回个index没啥意义。
对于map,如果设置了两个返回参数,则分别返回key和value;如果只设置了一个参数,则返回key(区别于上面slice的情况)。另外从19行的输出结果可以看出,用range遍历map时元素的输出顺序是随机的,因为map中元素的存储是无序的。
这里既然有个for循环那就顺便补充一点关于for的知识点。首先go语言中循环功能的实现只有for,不像c里面还有while、do while等乱七八糟的,因为本质功能都是一样的。另外go语言中for后面的小括号被去除了,但是大括号却成了必要的(即使下面只有一句话),不然就不好确定从哪里开始循环了。
package main
import "fmt"
func main() {
nums := []int{2, 3, 4} // 这是一个slice
sum := 0
for i, num := range nums {
sum += num
if num == 2 {
fmt.Println("index:", i, "num:", num) // index: 0 num: 2
}
}
fmt.Println(sum) // 9
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v) // b 8; a A // 输出顺序随机
}
for k := range m {
fmt.Println("key", k) // key a; key b
}
}