Go语言入门到实战——00主目录
在上一讲中我们学习了Go语言的数组和切片的知识。
package test
import "testing"
func TestMap(t *testing.T) {
m := map[int]int{1: 1, 2: 2, 3: 3}
t.Logf("len of m: %d", len(m))
t.Log(m[1])
t.Log(m[0]) //选择不存在的key,默认初值,但是不会增加m的长度
t.Logf("len of m: %d", len(m))
m[0] = 0
t.Log(m[0]) //插入新的值,长度变为4
t.Logf("len of m: %d", len(m))
m2 := make(map[int]int, 10)
t.Logf("len of m2: %d", len(m2))
//t.Log(cap(m2))会报错
}
从上面我们就会发现,go语言我们不能通过map返回值是否为nil来判断是否存在对应的key,因为会赋0值,思考一个问题,我们应该怎么去区分一个key是否存在呢?例子如下:
package test
import "testing"
func TestMap(t *testing.T) {
m := map[int]int{}
if v, ok := m[1]; ok {
t.Logf("key 1's val is %d", v)
} else {
t.Log("key 1 is not existing")
}
}
package test
import "testing"
func TestMap(t *testing.T) {
m := map[int]int{1: 1, 2: 2, 3: 3}
for k, v := range m {
t.Log(k, v)
}
}
1.map的value可以是函数
2.使用map实现set集合
3.map与duck type接口结合实现单一方法对象的工厂模式(这个在后面章节会讲到,这里只是提一下)
1.value是函数
package test
import "testing"
func TestMap(t *testing.T) {
m := map[int]func(n int) int{} //key是int,value是参数为int,返回值为int的函数
m[1] = func(n int) int { return n }
m[2] = func(n int) int { return n * n }
m[3] = func(n int) int { return n * n * n }
t.Log(m[1](2), m[2](2), m[3](2))
}
2.map实现set
go语言没有给我们提供set,但是我们可以自己使用map[type]bool来实现
实现set我们需要注意下面的几点:
1.保证元素的唯一性
2.实现基本的操作
添加元素
删除元素
判断元素是否存在
获取元素个数
package test
import "testing"
func TestMap(t *testing.T) {
mySet := map[int]bool{}
//1.添加元素
mySet[1] = true
mySet[2] = true
//2.判断元素存在
if mySet[1] {
t.Log("存在")
} else {
t.Log("不存在")
}
//3.获取元素的个数
t.Logf("set集合的元素个数是: %d", len(mySet))
//4.删除元素
delete(mySet, 1)
for k := range mySet {
t.Log(k)
}
}