算法
leetcode 第一题
Review
看的这篇文章 go maps in action
Declaration And Initialization
- map与pointer,slice 一样是引用类型;未初始化的值是nil,操作写入会引发panic
- make函数
make(map[keyType]valueType) - 字面量(litaral)
m := map[string]int{"width":100,"height":230}
worker with map
- 赋值
m['name'] = 'wudaolin'
- 取值
val := m['name']如果key不存在,返回keyType的默认值
- 判断key是否存在
val,exist := m['name']val的值同上,exist为布尔值,存在为true,不存在是false
Exploiting zero values(利用零值)
举了2个例子说明map[key]不存在时,返回相应零值的好处
- valueType是bool的时候,默认零值是false,这样就不用
val,exist := map[key]来判断了,直接if map[key]搞定 - valueType是slice的时候,重点是这句
treat a nil slice as a zero-length slice,还没能完全领会,有空再来看看
keyType
- 支持 Comparison operator的类型才能做map的key
- 基本类型,只包含基本类型的struct和array 可以做key
- function, slice, map 不可以
- 留意struct做key的情形,单独声明个struct type做key会带来便利
并发
map不是并发安全,需要sync包的 Mutex/RWMutex来做并发控制
迭代顺序
无序,如果想保证书序,建议如下,把key取出来排个序,再迭代
import "sort"
var m map[int]string
var keys []int
for k := range m {
keys = append(keys, k)
}
sort.Ints(keys)
for _, k := range keys {
fmt.Println("Key:", k, "Value:", m[k])
}