Go Map
作者:互联网
目录
一、Map声明
1、声明一个 map 的三种方式
package _map
import "testing"
//map 初始化
func TestMapInit(t *testing.T) {
//定义一个 map 数据类型,并以 key,value 的格式初始化里面的值,
m1 := map[string]int{"one":1, "two":2, "three":3}
//只定义 map,不赋初值,map 的大小也是可以自动伸缩的。
m2 := map[string]int{}
//通过 make() 方法定义一个 map,第一个参数是, 第二个参数是容量的大小。
//如果我们知道容量的大小,可以先设置好,这样性能更好。
//创建 map 类型,不能向切片一样指定长度,也没办法指定长度
m3 := make(map[string]int, 10)
//给 map 某个 key 赋值
m2["five"] = 5
t.Log(m1) //map[one:1 three:3 two:2]
t.Log(m2) //map[five:5]
t.Log(m3) //map[]
t.Logf("length m1=%d", len(m1)) //3
t.Logf("length m2=%d", len(m2)) //1
//说明通过 make() 创建 map 类型,由于不能只能指定长度,所以 map 的长度为 0
t.Logf("length m3=%d", len(m3)) //0
//map 类型不能通过 cap() 函数获取容量的大小,切片类型则可以
//t.Logf("length m3=%d", cap(m3))
}
二、Map 元素的访问
1、区分不存在的元素和 map 初始化的值
package _map
import "testing"
//元素不存在和其值本来就和不存在的值一样如何做区分
func TestAccessNotExistingKey(t *testing.T) {
m1 := map[int]int{}
m1[2] =0
//访问一个不存在的 key
t.Log(m1[1]) //m1[1] 是不存在的,Go会初始化为 0
//方位一个存在的 key
t.Log(m1[2]) //m2[1] 是存在的,但是它的值却为0
//那么如果判断这个 key 是存在还是其值本来就是 0 呢?
//通过 go 返回值有两个来进行判断,第一个返回值是变量的值,第二个返回值是一个布尔值
if val, ok := m1[2]; ok {
t.Logf("m1[2]'s value is:%d", val)
} else {
t.Log("m1[2] isn't existing")
}
//输出结果:m1[2]'s value is:0
m2 := map[string]string{}
m2["two"] = ""
t.Log(m2["one"]) //m2["one"]不存在,返回空字符串
t.Log(m2["two"]) //m2["two"]存在,但是其值也是空字符串
if val, ok := m2["one"]; ok {
t.Logf("m2['one']'s value is:%s", val)
} else {
t.Log("m2['one'] isn't existing")
}
//输出结果:m2['one'] isn't existing
}
2、与其它主要编程语言的差异
在访问位的 key 不存在是,仍然会返回 0 或空字符串,不能通过返回 nil 来判断元素是否存在。
三、Map 遍历
1、map 的遍历方法和数组差不多
package _map
import "testing"
//map 的遍历,和对数组的遍历写法差不多
func TestMapTravel(t *testing.T) {
m := map[string]int{"one":1, "two":2, "three":3}
for key, val := range m{
t.Log(key, val)
}
}
四、Map 与工厂模式
- Map 的 value 可以是一个方法
- 与 Go 的 Dock type 接口放在一起,可以方便的实现单一方法对象的工厂模式。
1、map 的 value 是一个方法
package _map
import "testing"
//map 的 value 可以是一个方法
func TestMapWithFunValue(t *testing.T) {
//map 的 value 可以是一个方法
m := map[int]func(op int) int {}
//mp[1] 我们给它赋值为 op
m[1] = func(op int) int {
return op
}
//mp[2] 我们给它赋值为 op 的平方
m[2] = func(op int) int {
return op * op
}
//mp[3] 我们给它赋值为 op 的立方
m[3] = func(op int) int {
return op * op * op
}
//给第一个 key 的函数的参数传值 2,得到的结果也为 2
t.Log(m[1](2)) //2
//给第二个 key 的函数的参数传值 2,得到的结果也为 4
t.Log(m[2](2)) //4
//给第三个 key 的函数的参数传值 2,得到的结果也为 8
t.Log(m[3](2)) //8
}
五、实现 Set
Set 可以保证元素的唯一性,但是Go语言中没有 Set 实现,如果需要用 Set 的功能,可以用 map[type]bool 的方式来实现。
1、Set 的基本功能
- 元素的唯一性
- 添加元素
- 判断元素是否存在
- 删除元素
- 元素的个数
2、用 map 实现 set 的功能
package _map
import "testing"
//用 map 实现 set 的功能
func TestMapAsSet(t *testing.T) {
//初始化一个 set
mySet := map[int]bool{}
//如果要用 map 来实现 set 的功能,则 value 一定要是布尔值
mySet[1] = true
//判断 mySet 中某个元素实付存在
if mySet[1] {
t.Log("mySet[1] is exist")
} else {
t.Log("mySet[1] isn't exist")
}
//结果为:mySet[1] is exist
//在添加一个元素
mySet[2] = true
//获取 mySet 中元素的个数
t.Log(len(mySet)) //2
//删除某个 key
delete(mySet, 1)
//mySet的长度减少了一个,说明删除成功了
t.Log(len(mySet)) //1
}
注:这篇博文是我学习中的总结,如有转载请注明出处:https://blog.csdn.net/DaiChuanrong/article/details/117966591
标签:Map,Log,map,int,mySet,m2,Go,op 来源: https://blog.csdn.net/DaiChuanrong/article/details/117966591