Map
var map1 map[keytype]valuetype
key可以是任意可以用==或者!=
所以数组,切片,结构体不能作为key(含有数组切片的结构体不能作为key,只包含内建类型的struct是可以作为key的)。
value 可以是任意类型的 (连函数都可以做为value,存入的是函数代码的地址)
如果需要一对多时,可以将数组作为value,就很好的解决了这个问题
在通过key获取value时,如果key不存在,则会返回对应值类型的空值
val, ok := map1[key]
测试键值队是否存在。 存在ok返回为truedelete(map1,key1)
删除map1中的key1- for key,value := range map1 {…} 用来循环map
Map类型的切片
- 如果想要获取一个map类型的切片,我们必须使用俩次make()函数,第一次分配切片,第二次分配切片中每个map元素
package main
import "fmt"
func main() {
// Version A:
items := make([]map[int]int, 5)
for i:= range items {
items[i] = make(map[int]int, 1)
items[i][1] = 2
}
fmt.Printf("Version A: Value of items: %v\n", items)
// Version B: NOT GOOD!
items2 := make([]map[int]int, 5)
for _, item := range items2 {
item = make(map[int]int, 1) // item is only a copy of the slice element.
item[1] = 2 // This 'item' will be lost on the next iteration.
}
fmt.Printf("Version B: Value of items: %v\n", items2)
}
map的排序
- map默认是无序的,如果想要给map排序,可以将key拷贝到一个切片,再对切片进行排序。
// the telephone alphabet:
package main
import (
"fmt"
"sort"
)
var (
barVal = map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
"delta": 87, "echo": 56, "foxtrot": 12,
"golf": 34, "hotel": 16, "indio": 87,
"juliet": 65, "kili": 43, "lima": 98}
)
func main() {
fmt.Println("unsorted:")
for k, v := range barVal {
fmt.Printf("Key: %v, Value: %v / ", k, v)
}
keys := make([]string, len(barVal))
i := 0
for k, _ := range barVal {
keys[i] = k
i++
}
sort.Strings(keys)
fmt.Println()
fmt.Println("sorted:")
for _, k := range keys {
fmt.Printf("Key: %v, Value: %v / ", k, barVal[k])
}
}
将map的键值对调
- 新建一个map[value]key ,然后循环增加到新的map里面