Map声明
func TestInitMap(t *testing.T) {
//声明map
m1 := map[int]int{1: 1, 2: 4, 3: 9}
m2 := map[int]int{}
t.Log(m1[1]) //访问元素
t.Logf("len m1 = %d", len(m1)) //获取长度
m2[4] = 16 //添加元素
t.Logf("len m2 = %d", len(m2)) //获取长度
m3 := make(map[int]int, 10 /*capacity*/)
t.Logf("len m3 = %d", len(m3)) //获取长度
}
Map判断是否存在元素
func TestAccessNotExitingKey(t *testing.T) {
m1 := map[int]int{}
t.Log(m1[1]) //对于不存在的键值对,输出为0
m1[2] = 0
t.Log(m1[2]) //如果键值对本身的值就0,那怎么判断是否存在某个键值对呢?
if v, ok := m1[3]; ok {
t.Log("Key 3 is exist and value is", v)
} else {
t.Log("Key 3 is not existing")
}
}
Map的遍历
func TestTravelMap(t *testing.T) {
m1 := map[int]int{1: 1, 2: 4, 3: 9}
//for-each遍历map元素
for k, v := range m1 {
t.Log(k, v)
}
}
Map与工厂模式
- Map的value可以是一个方法
- 与Go的Dock type接口方式一起,可以方便的实现单一方法对象的工厂模式
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
}
实现Set
由于Go的内置集合中没有Set实现,可以使用map[type]bool
func TestMapForSet(t *testing.T) {
//实现set
mySet := map[int]bool{}
mySet[1] = true
n := 1
if mySet[n] {
t.Logf("%d is existing", n) //1 is existing
} else {
t.Logf("%d is not existing", n)
}
delete(mySet, 1) //删除key
if mySet[n] {
t.Logf("%d is existing", n)
} else {
t.Logf("%d is not existing", n) //1 is not existing
}
}
本文章参考来自Go语言从入门到实战