ARTS001

242 阅读1分钟

算法

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])
}

相关文章下次看看,里面不少主题很吸引人