欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Go学习笔记--Map基础

程序员文章站 2024-02-15 19:34:46
...

Go 学习笔记–Map基础

Map 声明

m := map[string]int{"one": 1, "two": 2, "three": 3}
m1 := map[string]int{}
m1["one"] = 1
m2 := make(map[string]int, 10 /*Initial Capacity*/)
func TestInitMap(t *testing.T){
        m1 := map[int]int{1:1, 2:2, 3:4}
        t.Log(m1[2])
        t.Logf("len m1=%d", len(m1))

        m2 := map[int]int{}
        m2[4] = 16
        t.Logf("len m2=%d", len(m2))

        m3 := make(map[int]int, 10)
        t.Logf("len m3=%d", len(m3))
}

Map 元素的访问

与其他主要编程语言言的差异

在访问的 Key 不不存在时,仍会返回零值,不能通过返回 nil 来判断元素是否存在
if v, ok := m["four"]; ok {
	t.Log("four", v)
} else {
	t.Log("Not existing")
}
func TestAccessNotExistingKey(t *testing.T){
        m1 := map[int]int{}
        t.Log(m1)  //map[]
        t.Log(m1[1])   //0
        m1[2] = 0
        t.Log(m1[2])    //0
        m1[3] = 0
        if v, ok := m1[3]; ok {
                t.Log(ok)  //m1[3]初始化时,ok = true
                t.Logf("key 3's value is %d", v)
        }else {
                t.Log(ok) //m1[3]没有初始化时,ok = false
                t.Log("key 3 is not existing.")
        }
}

Map 遍历

func TestTravelMap(t *testing.T){
        m1 := map[string]int{"one":1, "two":2, "three":3}
        for k,v := range m1 {
                t.Log(k, v)  //map的底层采用hash表机制,输出不是有序的
        }
}

Map 与工厂模式

  • Map 的 value 可以是一个方法
func TestMapWithFunValue(t *testing.T){
        m := map[int]func(op int) int{}
        m[1] = func(op int) int {return op}
        m[2] = func(op int) int {return op * op}
        m[3] = func(op int) int {return op * op * op}
        t.Log(m[1](2), m[2](2), m[3](2))  //2,4,8
}

用 Map 实现 Set

Go 的内置集合中没有 Set 实现, 可以 map[type]bool

  1. 元素的唯一一性
  2. 基本操作
  • 添加元素
  • 判断元素是否存在
  • 删除元素
  • 元素个数
func TestMapForSet(t *testing.T){
        mySet := map[int]bool{}
        mySet[1] = true
        n := 3
        if mySet[n] {
                t.Logf("%d is existing", n)
        } else {
                t.Logf("%d is not existing",n)
        }
        mySet[3] = true
        t.Log(len(mySet))
        delete(mySet,1)
        n = 1
        if mySet[n] {
                t.Logf("%d is existing", n)
        } else {
                t.Logf("%d is not existing",n)
        }
}