go-map使用

以下是阅读13年的文章获取到的信息,有的地方可能会有更新
map 类型看起来是这样的 map[KeyType]ValueType,KeyType 可以是任何可比较的类型,ValueType 可以是任何类型了。
map 类型不是并发安全的,这个要注意。
map 的遍历顺序不保证是固定的。

map 的使用

建立变量

先要声明变量,因为 map 是引用类型,所以 m 的值是nil,这时可以读,但是如果写入会 panic
var m map[string]string
使用内置的make函数创建一个非nil的map,
m = make(map[string]string)

// 直接创建
m2 := make(map[string]string)

然后就可以操作了

// 赋值
m["a"] = "aa"
m["b"] = "bb"

// 取值,如果取的值不存在,那么返回类型的空值
str := m["a"]

在map中访问结构体struct成员变量

map里面的数据是动态变化的所以不能直接引用。

func main() {
p := make(People)
p["HM"] = Person{"Hank McNamara", 39}
//这里会出错,Reports assignments directly to a struct field of a map.
p["HM"].age += 1
}

解决方法有两个,1 使用指针,下面的样例;2 新建个结构体赋值后,再重新赋值给map成员

type Person struct {
name string
age int
}

type People map[string]*Person

func main() {
p := make(People)
p["HM"] = &Person{"Hank McNamara", 39}
p["HM"].age += 1
fmt.Printf("age: %d\n", p["HM"].age)
}

建立同时初始化

commits := map[string]int{
"rsc": 3711,
"r": 2138,
"gri": 1908,
"adg": 912,
}

// 这个语法还可以用来初始化空 map,和 make功能一样。
m = map[string]int{}

获取元素个数

count := len(m)

删除

delete 不返回,如果指定的 key 不存在,什么也不做。
delete(m, "route")

key 是否存在

ok 是 true 时表示存在, false 表示不存在
v 在 key 存在时表示 value 的值, 不存在时为类型的空值

val, exist := m["route"]

// 只需要判断 key 是否存在时,可以用 _ 代替 v
_, exist := m["route"]

遍历

注意输出同样无序的结果

for key, value := range m {
fmt.Println("Key:", key, "Value:", value)
}

To json

package commontest

import (
"testing"
"encoding/json"
)

func TestMap2Json(t *testing.T) {
mapInstance := make(map[string]interface{})
mapInstance["Name"] = "liang637210"
mapInstance["Age"] = 28
mapInstance["Address"] = "北京昌平区"

jsonStr, err := json.Marshal(mapInstance)

if err != nil {
t.Fatal(err)
}

t.Logf("Map2Json 得到 json 字符串内容:%s", jsonStr)
}