map 是散列表的引用, 数据组+链表的智慧结合
【创建】
- 使用内建函数 :mymap:=make(map(string)int)
- 通过字面量赋值
mymap:=map[string]int{
"a":1,
"b":2,
}
空map 为 map[string]int{}
【删除】
使用内建函数delete
delete(mymap,"a")
delete原型如下
// The delete built-in function deletes the element with the specified key
// (m[key]) from the map. If m is nil or there is no such element, delete
// is a no-op.
func delete(m map[Type]Type1, key Type)
【遍历】
for k,v:=range mymap{
fmt.Println(k,v)
}
【零值】
元素不存在 or 元素存在 但是值 为 零
【判断元素是否在map中】
if t ,ok:=mymap["mykey"]; !ok{
do something
}
【map间的比较】
func equal(x, y map[string]int) bool {
if len(x) != len(y) {
return false
}
for k, xv := range x {
if yv, ok := y[k]; !ok || yv != xv {
return false
}
}
return true
【构建set】
利用map中的key的唯一性 构建set
set:=make(map[string]bool)
y:=string(something)
if !set[y] {
set[y] = true
}
【构建slice类型的键值map】
首先通过一个函数 实现 slice到字符串的映射,然后赋值给map的键值
package main
import (
"fmt"
//"strings"
)
//实现slice 到string的转换
func k(list []string) string {
return fmt.Sprintf("%q", list)
}
func main() {
//准备数据
x := [3][]string{
[]string{"a", "b", "c"},
[]string{"aa", "bb", "cc"},
[]string{"aaa", "bbb"},
}
fmt.Println(x)
fmt.Printf("%T", x)
m := make(map[string]int)
for _, b := range x {
fmt.Printf("b is: %v ,type is %T\n", b, b)
newkey := k(b)
fmt.Printf("newkey is: %v ,type is %T\n", newkey, newkey)
m[newkey] = 1
}
fmt.Println("m is:")
fmt.Println(m)
}
执行结果:
[[a b c] [aa bb cc] [aaa bbb]]
[3][]stringb is: [a b c] ,type is []string
newkey is: ["a" "b" "c"] ,type is string
b is: [aa bb cc] ,type is []string
newkey is: ["aa" "bb" "cc"] ,type is string
b is: [aaa bbb] ,type is []string
newkey is: ["aaa" "bbb"] ,type is string
m is:
map[["a" "b" "c"]:1 ["aa" "bb" "cc"]:1 ["aaa" "bbb"]:1]
即实现了 ["aaa" "bbb"]: 为key的场景。