注:本文是對(duì)golang-101-hacks中文翻譯。
Map是一種指向哈希表的引用類型滴铅,可以使用map構(gòu)造一個(gè)“鍵值”類型的數(shù)據(jù)庫吕喘,這在實(shí)際編程中非常高效赘那。例如,下面的代碼是統(tǒng)計(jì)切片中每個(gè)元素的總數(shù):
package main
import (
"fmt"
)
func main() {
s := []int{1, 1, 2, 2, 3, 3, 3}
m := make(map[int]int)
for _, v := range s {
m[v]++
}
for key, value := range m {
fmt.Printf("%d occurs %d times\n", key, value)
}
}
運(yùn)行結(jié)果
3 occurs 3 times
1 occurs 2 times
2 occurs 2 times
此外氯质,根據(jù)Go spec:“map是一個(gè)無序的元素組合募舟,其中一種類型稱為元素類型,另一種類型(稱為鍵類型)是由惟一鍵索引組成闻察」敖福”如果再次運(yùn)行上述程序,輸出結(jié)果可能會(huì)有所不同:
Moreover, according to Go spec: "A map is an unordered group of elements of one type, called the element type, indexed by a set of unique keys of another type, called the key type.". So if you run the above program another time, the output may be different:
2 occurs 2 times
3 occurs 3 times
1 occurs 2 times
你無法推測map的元素順序辕漂。
map的鍵必須滿足與“ ==”運(yùn)算符進(jìn)行比較:內(nèi)置類型(如int呢灶,string等)滿足此要求; 而切片不可以。對(duì)于struct類型钉嘹,如果其成員都可以通過“ ==”運(yùn)算符進(jìn)行比較鸯乃,那么此結(jié)構(gòu)也可以用作鍵。
當(dāng)您訪問鍵不存在時(shí)跋涣,map將返回nil缨睡。即
package main
import (
"fmt"
)
func main() {
m := make(map[int]bool)
m[0] = false
m[1] = true
fmt.Println(m[0], m[1], m[2])
}
輸出結(jié)果如下
false true false
m[0]
和m[2]
的值都是' false '鸟悴,所以您不能判斷鍵是否真的存在在map中。解決方法是使用多返回值的“comma-ok”模式:
value, ok := map[key]
如果key存在 ok返回值是true 否則是false
有時(shí)奖年,你可能不需要map的值细诸,而只是將map作為一個(gè)集合使用。在這種情況下陋守,您可以將map的值聲明為空結(jié)構(gòu)體:struct{}
震贵。如下面的例子:
package main
import (
"fmt"
)
func check(m map[int]struct{}, k int) {
if _, ok := m[k]; ok {
fmt.Printf("%d is a valid key\n", k)
}
}
func main() {
m := make(map[int]struct{})
m[0] = struct{}{}
m[1] = struct{}{}
for i := 0; i <=2; i++ {
check(m, i)
}
}
輸出結(jié)果如下
0 is a valid key
1 is a valid key
使用內(nèi)置函數(shù)delete
刪除map上的元素,即使這個(gè)鍵不存在也不會(huì)報(bào)錯(cuò)。
delete(map, key)
參考:
Effective Go;
The Go Programming Language Specification;
The Go Programming Language.