Go Map

目录

一、Map声明

1、声明一个 map 的三种方式

二、Map 元素的访问

1、区分不存在的元素和 map 初始化的值

2、与其它主要编程语言的差异

3、map 是否可以进行比较

三、Map 遍历

1、map 的遍历方法和数组差不多

四、Map 与工厂模式

1、map 的 value 是一个方法

五、实现 Set

1、Set 的基本功能

2、用 map 实现 set 的功能


一、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 来判断元素是否存在

3、map 是否可以进行比较

//map是否可以进行比较
func TestMapComparing(t *testing.T) {
	m1 := map[int]string{1:"one", 2:"two", 3:"three"}
	m2 := map[int]string{1:"one", 2:"two", 3:"three"}

	//这里会报错 map can only be compared to nil
	if m1 == m2 {
		t.Log("yes")
	} else {
		t.Log("no")
	}
}

结论map之间不能进行比较
 

三、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 的基本功能

  1. 元素的唯一性
  2. 添加元素
  3. 判断元素是否存在
  4. 删除元素
  5. 元素的个数

2、用 map 实现 set 的功能

:这篇博文是我学习中的总结,如有转载请注明出处:https://blog.csdn.net/DaiChuanrong/article/details/117966591

上一篇Go数据类型

下一篇Go字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值