Go语言学习 _基础04 _Map&Set

Go语言学习 _基础04 _Map&Set

1、map
package map_test

import (
   "fmt"
   "testing"
)

func TestInitMap(t *testing.T) {
   m1 := map[int]int{1: 1, 2: 4, 3: 9} // 初始化方式一 声明 并初始化
   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) // key-walue : int-int cap = 10
   // 初始化方式三 通过 make函数 (map 的 key 和 value 都不是 确定的 大小可能不一 所以 map的 make方法 没有len参数)
   t.Logf("len m3 = %d", len(m3)) 
}

func TestAccessNotExistingkey(t *testing.T) {
   m1 := map[int]int{}
   t.Log(m1[1])
   m1[2] = 0
   t.Log(m1[2]) // 对于不存在的 键值 会被 默认输出 0 ,那么这样和 初始化wei0 就很难区分了 吗? Go中 需要进行手动的 区分
   m1[3] = 0
   isExit(m1, 3)
   isExit(m1, 4)
}

// TODO 手动判断 键值 是否存在
func isExit(m map[int]int, k int) {
   if v, ok := m[k]; ok {
      fmt.Printf("Key %d 's value is %d", k, v)
   } else {
      fmt.Printf("Key %d is not exiting !", k)
   }
}

func TestTravelMap(t *testing.T) {
   m1 := map[int]int{1: 1, 2: 4, 3: 9}
   for k, v := range m1 {  // 通过range遍历 map
      t.Log(k, v)
   }
}
// 通过 Map 实现 工厂模式 TODO 以后 后面会 加一个 Java 实现的 比较 看看 Go 的简洁
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、set

Go语言中 没有 set 不过 可以 通过 Map 来 模拟 set 使用 key 作为 集合元素 使用 bool 作为 值 true 表示 存在

package set_test

import (
   "fmt"
   "testing"
)
 // TODO Go语言中 没有 set 不过 可以 通过 Map 来 模拟 set 使用 key 作为 集合元素 使用 bool 作为 值 true 表示 存在
func TestMapForSet(t *testing.T) {
   mySet := map[int]bool{}
   mySet[1] = true
   n := 3
   isExiting(mySet, n)
   mySet[3] = true
   t.Log(len(mySet))
   delete(mySet, 1) // 删除 元素
   isExiting(mySet, n)
}
func isExiting(set map[int]bool, k int) {
   if  set[k] {
      fmt.Printf("%d  is exiting", k)
   } else {
      fmt.Printf(" %d is not exiting !",k)
   }
}
原文地址:https://www.cnblogs.com/OwlInTheOaktree/p/15209874.html