Monkey

个人站

The master has failed more times than the beginner has tried


GO语言中Map

  • map 的声明
m := map[string]int{"one":1, "two":2, "three":3}
m1 := map[string]int{}
m1["one"] = 1
// map 和 slice 一样都是自增长度的存储,每一次在增长的时候都会分配存
//储空间同时进行数据拷贝,这样会有相当的消耗。如果在声明的时候指定容量的大小
//就可以避免性能的消耗。
m2 := make(map[string]int/*map 类型*/, 10/*初始化 cap*/)
// 为什么不初始化 len ? 
// len 参数在声明的时候都会赋值为默认的零值,map 不会声明默认零值的
  • 判断 map 中的 key 对应 value 是否存在;
    • ok patten 的方式判断;
func TestAccessNoExistingkey(t *testing.T)  {
	// 声明一个空 map
	m := map[int]int{}
	// 访问一个不存在的 value
	t.Log(m[1]) // 0
	m[2] = 0
	// 访问一个 value 为 0 的key
	t.Log(m[2]) // 0
	// 如何区分访问的 value 不存在还是 值为0 呢?
	// 使用 OK  patten 判断 该 key 是否存在,OK 为 true 则存在
	if v, ok := m[1]; ok {
		t.Logf("m[1] 的 value 是 %d", v)
	} else {
		t.Log("m[1] value is  not  exists")
	}
}
  • map 遍历
    • 使用 range 关键字进行遍历
func TestTravelMap(t *testing.T)  {
	m1 := map[string]string{"key1": "value1", "key2":"value2", "key3":"value3"}
	for key, val := range m1{
		t.Log(key, val)
	}
	/**
		map_test.go:39: key1 value1
	    map_test.go:39: key2 value2
	    map_test.go:39: key3 value3
	 */
}
  • 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
	}
	// 调用 m[1] 的value【function】并传递参数 2
	t.Log(m[1](2), m[2](2), m[3](2)) // 2 4 8
}

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦