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: 4, 3: 9}
t.Log(m1[2])
t.Logf("len m1=%d", len(m1))
m2 := map[int]int{}
m2[5] = 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")
}
// map不存在key测试 不存在key 取值为0, 判断是否存在key ok:=m1[3]
func TestAccessNotExistingKey(t *testing.T) {
m1 := map[int]int{}
t.Log(m1[1])
m1[2] = 0
t.Log(m1[2])
m1[3] = 0
// v, ok:=m1[3]; v: m1[3] ok: 判断map是否存在该key 存在返回true 反之false
if v, ok := m1[3]; ok {
t.Logf("Key 3 value is %d", v)
} else {
t.Logf("Key 3 is not existing")
}
}
Map 遍历
// map 遍历
func TestTravelMap(t *testing.T) {
m1 := map[int]int{1: 2, 2: 4, 3: 8, 4: 16}
for k, v := range m1 {
t.Log(k, v)
}
}
Map 与工厂模式
- Map 的 value 可以是一个方法
- 与 Go 的 Dock type 接口方式一起,可以方便的实现单一方法对象的工厂模式
实现 Set
Go 的内置集合中没有 Set 实现, 可以 map[type]bool
- 元素的唯一性
- 基本操作
- 添加元素
- 判断元素是否存在
- 删除元素
- 元素个数
package _map
import "testing"
// - 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](1), m[2](2), m[3](3))
}
// set
func TestMapForSet(t *testing.T) {
mSet := map[int]bool{}
mSet[1] = true
//n := 1 // map_ext_test.go:27: 1 is existing
n := 3 // map_ext_test.go:30: 3 is not existing
if mSet[n] {
t.Logf("%d is existing", n)
} else {
t.Logf("%d is not existing", n)
}
mSet[3] = true
t.Log(len(mSet)) // map_ext_test.go:33: 2
delete(mSet, 1)
n = 1 // map_ext_test.go:39: 1 is not existing
if mSet[n] {
t.Logf("%d is existing", n)
} else {
t.Logf("%d is not existing", n)
}
}
PS:学习笔记,侵删!