3.2 Map 声明、元素访问及遍历
peter 360 3

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)
    }
}
评论区

索引目录