go 的字典类型是一个哈希表的特定实现,键的类型是受限的,但元素可以是任意类型的。
字典的用法:
package main
import "fmt"
func main(){
aMap := map[string]int {
"one": 1,
"two": 2,
"three": 3,
}
k := "two"
v, ok := aMap[k]
if ok {
fmt.Printf("The element of key %q: %d\n", k, v)
} else {
fmt.Println("Not found!")
}
}
字典的键不能是哪些类型?
函数类型、字典类型和切片类型。因为键类型必须支持判等操作。
错误示例:
package main
import "fmt"
func main(){
//var badMap1 = map[[]int]int{} // 引发编译错误
var badMap2 = map[interface{}]int {
"1": 1,
[]int{2}: 2, // 引发 panic
3: 3,
}
fmt.Printf("%v\n", badMap2)
}
应优先考虑哪些类型作为字典的键类型?
求哈希和判等操作的速度越快,对应的类型就越适合作为键类型。
对于所有的基本类型、指针类型、以及数组类型、结构体类型和接口类型均可作为键。
应优先选用数值类型和指针类型作为键。
在值为 nil 的字典上执行读操作会成功吗?写操作呢?
仅声明而不初始化一个字典类型的变量时,它的值是 nil。
除了添加键值元素对,在值为 nil 的字典上做任何操作都不会引起错误。
package main
import "fmt"
func main(){
var m map[string]int
key := "two"
elem, ok := m[key] // 读取,正常
delete(m, key) // 删除,正常
m["two"] = elem // 添加,引发 panic
}