go map作为返回值需小心

测试文件 test.go

package main

import "fmt"

var RankMap = map[int]int{
	10: 3,
	11: 2,
	12: 1,
	13: 4,
}

func main() {
	fmt.Println("=========getRank==========")
	fmt.Printf("%p\n", RankMap)
	fmt.Println("RankMap", RankMap)
	SetRankMap(1)
	fmt.Println("RankMap", RankMap)
	SetRankMap(2)
	fmt.Println("RankMap", RankMap)
}

func SetRankMap(change int) {
	res := RankMap //此处相当于指针指向了全局map
	fmt.Printf("%p\n", RankMap)
	fmt.Println("change", change)
	if change == 1 {
		res[11] = 4
		res[13] = 2
	}

	if change == 2 {
		res[11] = 2
		res[13] = 4
	}

	fmt.Println("res", res)
}

输出内容

=========getRank==========
0xc000062180
RankMap map[10:3 11:2 12:1 13:4]
0xc000062180
change 1
res map[10:3 11:4 12:1 13:2]
RankMap map[10:3 11:4 12:1 13:2]
0xc000062180
change 2
res map[10:3 11:2 12:1 13:4]
RankMap map[10:3 11:2 12:1 13:4]

如何解决map如上的问题

把map变成局部变量

package main

import "fmt"

func main() {
	fmt.Println("=========getRank==========")
	RankMap1 := SetRankMap(1)
	fmt.Println("RankMap1", RankMap1)
	RankMap2 := SetRankMap(2)
	fmt.Println("RankMap1", RankMap2)
}

func SetRankMap(change int) map[int]int {
	res := map[int]int{
		10: 3,
		11: 2,
		12: 1,
		13: 4,
	}

	fmt.Printf("%p\n", res)
	fmt.Println("change", change)
	if change == 1 {
		res[11] = 4
		res[13] = 2
	}

	if change == 2 {
		res[11] = 2
		res[13] = 4
	}

	return res
}

输出

=========getRank==========
0xc00006e180
change 1
res map[10:3 11:4 12:1 13:2]
RankMap1 map[10:3 11:4 12:1 13:2]
0xc00006e210
change 2
res map[10:3 11:2 12:1 13:4]
RankMap1 map[10:3 11:2 12:1 13:4]

循环深拷贝

package main

import "fmt"

var RankMap = map[int]int{
	10: 3,
	11: 2,
	12: 1,
	13: 4,
}

func main() {
	fmt.Println("=========getRank==========")
	fmt.Printf("%p\n", RankMap)
	fmt.Println("RankMap", RankMap)
	res := RankMapCopy()
	fmt.Printf("%p\n", res)
	fmt.Println("res", res)
}

func RankMapCopy() map[int]int {
	res := map[int]int{}
	for key, val := range RankMap {
		res[key] = val
	}

	return res
}

输出

=========getRank==========
0xc000098180
RankMap map[10:3 11:2 12:1 13:4]
0xc0000981e0
res map[10:3 11:2 12:1 13:4]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值