Golang中的map

本文探讨了如何避免Map的深拷贝问题,包括使用`make`初始化、检查键值是否存在和空值、foreach遍历、以函数作为值以及利用Map模拟Set的功能。通过实例演示了这些关键点,并展示了如何在Go中高效处理Map操作。
摘要由CSDN通过智能技术生成

Map引起的深拷贝问题使用make避免

func TestMapInit(t *testing.T)  {
	m := map[string]int{"one":1,"two":2,"three":3}
	m1 := map[string]int{}
	m1["one"] = 1
	m["one"] = 2

	//make 和C++STL中resize一样,为了避免深拷贝导致的性能下降,直接初始化一个大内存
	m2 := make(map[string]int,10/*Initial Capacity*/)
	//为什么不初始化len len所指的单元格都会默认的赋值为0 map没法做默认的0值
	//函数不能用来求map的cap
	m2["two"] = 6
	t.Log(m1)
	t.Logf("len m1 = %d",len(m1))
}

Map判断K值是否存在以及Value是否为空

//访问出现的两大问题 1.这个Key值存在吗?2.这个Key的Value是不是一个空值
func TestAccessNotTxistngKey(t *testing.T)  {
	m1 := map[int]int{}
	//访问不存在的Key给Value赋值默认的0
	//无法区分值存在还是不存在,因为Value都是0
	t.Log(m1[1])
	m1[2] = 0
	t.Log(m1[2])

	//主动判断这个值不存在,还是这个值本身就是0值
	//两个返回值,前面的返回值为数值,后面的返回值是
	//当访问Key不存在时,会返回0值 不能通过返回nil来判断元素是否存在
	//Logf 按照规格打印,Log普通打印
	if v,ok := m1[3];ok{
		t.Log("num",v,"is Nil",ok)
	}else{
		t.Log("Its nil")
	}
}

使用for each遍历Map

//使用for each遍历Map
func TestTravelMap(t *testing.T){
	m1 := map[int]int{1:1,2:2,3:9}
	for k,v :=range m1{
		t.Log(k,v)
	}
}

使用函数类型作为Map的Value

//Map的value可以是一个方法
//与Go的Dock type接口方式一起,可以方便实现单一方法对象的工厂模式
func TestMapWithFunValue(t *testing.T){
	//value变成了一个方法的定义 方法类型(参数)返回值
	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}

	//通过访问Key获得Key后面不同的函数
	t.Log(m[1](2),m[2](2),m[3](2))
}

使用Map实现Set的功能

//实现Set 元素的唯一性
//Go的内置集合中没有Set的实现,可以采用map[type]bool
//元素的唯一性
//基本操作 添加/删除/判断元素是否存在/元素个数

func TestMapForSet(t *testing.T) {
	mySet := map[int]bool{}
	mySet[1] = true
	n := 1
	// 通过n的改变来促使Set集合判断数值是否存在
	if mySet[n] {
		t.Logf("%d is exiting!", n)
	} else {
		t.Logf("%d is not exiting", n)
	}

	mySet[10] = true
	//通过Map的长度获得集合中独立元素的个数
	t.Log(len(mySet))
	//使用delete删除掉指定的元素
	delete(mySet,1)

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值