一篇文章带你了解Golang的Map使用方法

96 阅读1分钟

Map声明

func TestInitMap(t *testing.T) {
   //声明map
   m1 := map[int]int{1: 1, 2: 4, 3: 9}
   m2 := map[int]int{}
   t.Log(m1[1])                   //访问元素
   t.Logf("len m1 = %d", len(m1)) //获取长度
   m2[4] = 16                     //添加元素
   t.Logf("len m2 = %d", len(m2)) //获取长度
   m3 := make(map[int]int, 10 /*capacity*/)
   t.Logf("len m3 = %d", len(m3)) //获取长度
}

Map判断是否存在元素

func TestAccessNotExitingKey(t *testing.T) {
   m1 := map[int]int{}
   t.Log(m1[1]) //对于不存在的键值对,输出为0
   m1[2] = 0
   t.Log(m1[2]) //如果键值对本身的值就0,那怎么判断是否存在某个键值对呢?
   if v, ok := m1[3]; ok {
      t.Log("Key 3 is exist and value is", v)
   } else {
      t.Log("Key 3 is not existing")

   }

}

Map的遍历

func TestTravelMap(t *testing.T) {
   m1 := map[int]int{1: 1, 2: 4, 3: 9}
   //for-each遍历map元素
   for k, v := range m1 {
      t.Log(k, v)
   }
}

Map与工厂模式

  • Map的value可以是一个方法
  • 与Go的Dock type接口方式一起,可以方便的实现单一方法对象的工厂模式
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
}

实现Set

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

func TestMapForSet(t *testing.T) {
   //实现set
   mySet := map[int]bool{}
   mySet[1] = true
   n := 1
   if mySet[n] {
      t.Logf("%d is existing", n) //1 is existing
   } else {
      t.Logf("%d is not existing", n)
   }
   delete(mySet, 1) //删除key
   if mySet[n] {
      t.Logf("%d is existing", n)
   } else {
      t.Logf("%d is not existing", n) //1 is not existing
   }
}

本文章参考来自Go语言从入门到实战