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)
}
}