10丨Map 声明、元素访问及遍历 & 11丨Map与工厂模式,在Go语言中实现Set
10丨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*/) //为什么不初始化len? 切片的len会赋默认的0值,map无法做到
Map元素的访问
与其他主要编程语言的差异
在访问的Key不存在时,仍会返回零值,不能通过返回n来判断元素是否存在
if v, ok := m["four"]; ok { t.Log("four", v) } else { t.Log("Not existing") }
Map遍历
m := map[string]int{"one": 1, "two": 2, "three": 3} for k, v := range m { t.Log(k, v) }
测试代码
package ch7 import ( "testing" ) // map 的定义 func TestIntMap(t *testing.T) { m1 := map[int]int{1: 1, 2: 2, 3: 9} t.Log(m1[2]) //2 t.Logf("len m1=%d", len(m1)) //len m1=3 m2 := map[int]string{} m2[4] = "lewen" t.Logf("len m2=%d", len(m2)) // len m2=1 m3 := make(map[int]int, 10) // 10 是map容量 t.Logf("len m3=%d", len(m3)) // len m3=0 ,cap(m3)) 不可以 } // 访问不存在的值 func TestAccessNotExistingKey(t *testing.T) { m1 := map[int]int{} t.Log(m1[1]) //不存在,返回0值 m1[2] = 0 t.Log(m1[2]) // 存在本身为0值 if v, bol := m1[3]; bol { // v为值 , bol 为 true 该值存在,False 该值不存在 判断值的正确方式 t.Log(bol) t.Logf("key 3's value is %d", v) } else { t.Log(bol) t.Log("key 3 is not existing.") } } // map 的遍历 func TestTravelMap(t *testing.T) { m1 := map[int]int{1: 1, 2: 2, 3: 9} for k, v := range m1 { t.Log(k, v) } /*map_test.go:47: 1 1 map_test.go:47: 2 2 map_test.go:47: 3 9*/ }
11丨Map与工厂模式,在Go语言中实现Set
Map与工厂模式
- Map的vaue可以是一个方法
- 与Go的 Dock type接口方式一起,可以方便的实现单一方法对象的工厂模式
实现Set
Go的内置集合中没有Set实现,可以 map [type] bool
1.元素的唯一性
2.基本操作
- 1)添加元素
- 2)判断元素是否存在
- 3)删除元素
- 4)元素个数
代码示例
package ch8 import "testing" func TestMapWithFunValue(t *testing.T) { m := map[int]func(arg int) int{} // key value是个函数 返回值 m[1] = func(arg int) int { return arg } m[2] = func(arg int) int { return arg * arg } m[3] = func(arg int) int { return arg * arg * arg } t.Log(m[1](2), m[2](2), m[3](2)) // map_test.go:56: 2 4 8 } 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)) //2 delete(mySet, 1) // 指定要删掉的key /* map_test.go:76: 3 is not existing map_test.go:79: 2*/ m := 1 if mySet[m] { t.Logf("%d is existing", m) } else { t.Logf("%d is not existing ", m) } }
本文来自博客园,作者:元贞,转载请注明原文链接:https://www.cnblogs.com/yuleicoder/articles/14310336.html
浙公网安备 33010602011771号