Map 声明
m := map[string]int{"one": 1, "two": 2, "three": 3}
m1 := map[string]int{}
// 这种赋值方式,直接指定了 map 的初始化大小,可以很好的避免因为扩容导致的效率低下
m2 := make(map[string]int, 10 /* Initial Capacity */)
// 赋值方法
m1["one"] = 1
测试实例 1
func TestInitMap(t *testing.T) {
m1:=map[int]int{1:1,2:4,3:9}
t.Log(m1[2]) // 4
t.Logf("len m1 = %d", len(m1)) // len m1 = 3
m2 :=map[int]int{}
m2[4] = 16
t.Logf("len m2 = %d", len(m2)) // len m2 = 1
m3:=make(map[int]int, 10)
t.Logf("len m3 = %d", len(m3)) // len m3 = 0
}
Map 元素的访问
与其他主要编程语言的差异
在访问的 Key 不存在时,仍会返回零值,不能通过返回 nil
来判断元素是否存在
测试实例 2
func TestAccessNotExistingKey(t *testing.T) {
m1 := map[int]int{}
// 测试一个不存在的值,输出 0
t.Log(m1[1]) // 0
// 测试一个 value 为 0 的值,测试结果也是 0
m1[2] = 0
t.Log(m1[2]) // 0
// 如果一个值不存在,或者 value 为 0,得到的都是 0,如何解决这个问题?
// m1[3] = 0
if v, ok := m1[3]; ok {
t.Logf("m1[3] = %d", v)
} else {
t.Log("Key 3 is not existing ")
}
}
Map 遍历
与数组遍历是一致的
测试代码 3
func TestTravelMap(t *testing.T) {
m1 := map[int]int{1:1,2:4,3:9}
for k, v := range m1 {
t.Log(k, v)
}
}