Go学习笔记--Map基础
程序员文章站
2024-02-15 19:34:46
...
Go 学习笔记–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*/)
func TestInitMap(t *testing.T){
m1 := map[int]int{1:1, 2:2, 3:4}
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)
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")
}
func TestAccessNotExistingKey(t *testing.T){
m1 := map[int]int{}
t.Log(m1) //map[]
t.Log(m1[1]) //0
m1[2] = 0
t.Log(m1[2]) //0
m1[3] = 0
if v, ok := m1[3]; ok {
t.Log(ok) //m1[3]初始化时,ok = true
t.Logf("key 3's value is %d", v)
}else {
t.Log(ok) //m1[3]没有初始化时,ok = false
t.Log("key 3 is not existing.")
}
}
Map 遍历
func TestTravelMap(t *testing.T){
m1 := map[string]int{"one":1, "two":2, "three":3}
for k,v := range m1 {
t.Log(k, v) //map的底层采用hash表机制,输出不是有序的
}
}
Map 与工厂模式
- 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](2), m[2](2), m[3](2)) //2,4,8
}
用 Map 实现 Set
Go 的内置集合中没有 Set 实现, 可以 map[type]bool
- 元素的唯一一性
- 基本操作
- 添加元素
- 判断元素是否存在
- 删除元素
- 元素个数
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))
delete(mySet,1)
n = 1
if mySet[n] {
t.Logf("%d is existing", n)
} else {
t.Logf("%d is not existing",n)
}
}