map 是一种特殊的数据类型,它是一种元素对的无序集合,元素对为 键(key)值(value) 形式。我们可以通过 key 来快速找到与之对应的 value。
map 是引用类型,声明方式:
var name map[key_type]value_type
,name 为map的变量名,key_type 为键类型,value_type 为键对应的值类型。声明时可以不需要指定 map 的长度,因为 map 是可以动态增长的。未初始化的 map 的值是 nil。
检查一个键是否在 map 中
检查一个 key 在 map 主要是通过下面的方式:
if v, ok := map[key]; ok{ // 存在 } 复制代码
ok 为 true 表示存在,key 对应的值为 v,若不需要获取值则可以用 '_'代替,即:if _, ok := map[key]; ok{}
json 与 map 互转
- json 转 map:
package main import ( "encoding/json" "fmt" ) func main() { jsonStr := ` { "name":"test", "address":"beijing" }` var mapRes map[string]interface{} err := json.Unmarshal([]byte(jsonStr), &mapRes) if err != nil { fmt.Println(err) } fmt.Println(mapRes) } 复制代码
运行结果:
map[address:beijing name:test] 复制代码
- map 转 json:
package main import ( "encoding/json" "fmt" ) func main() { mapRes := map[string]interface{}{ "name": "test", "address": "beijing", } jsonStr, err := json.Marshal(mapRes) if err != nil { fmt.Println(err) } fmt.Println(string(jsonStr)) } 复制代码
运行结果:
{"address":"beijing","name":"test"} 复制代码
map 排序
Go 语言中,map 是无序的,如果需要对 map 进行排序,实现的思路是:将 map 中的 key 复制到一个切片中,然后对此切片进行排序,再遍历此切片,获取对应的 key 、value。
示例:
package main import ( "fmt" "sort" ) func main() { mapRes := make(map[int]int,5) mapRes[0] = 1 mapRes[1] = 3 mapRes[2] = 2 var temp []int for _,v := range mapRes{ temp = append(temp,v) } sort.Ints(temp) for k, v := range temp { fmt.Println(k, v) } } 复制代码
运行结果:
0 1 1 2 2 3 复制代码
map 类型的切片
如果要使用一个 map 类型的切片,必须使用两次 make() 函数,一次分配切片,一个分配切片中的每个 map 元素。
示例:
package main import "fmt" func main() { sli := make([]map[int]int, 3) for i := range sli { sli[i] = make(map[int]int, 6) sli[i][1] = 1+i sli[i][2] = 2+i } fmt.Printf("value:%v\n", sli) }