测试文件 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]