Go语言中Map所有子Map意外同步更新问题求助
问题原因与解决方案:Go中Map引用类型导致的意外更新
问题原因
你遇到的问题根源在于Go语言里map是引用类型。你创建了一个rxTx map实例后,将它同时赋值给typeMap的所有键(wlan、ether、bridge、wg),这意味着这些键都指向同一个底层map对象。当你修改typeMap["ether"]的rx和tx值时,实际上是在修改那个共享的底层map,所以所有关联的键都会同步看到变化,导致所有子map的数值都被更新。
解决方案
要解决这个问题,需要确保typeMap中的每个键都对应一个独立的子map实例,而不是共享同一个引用。以下是两种常用方法:
方法1:逐个初始化独立子map
直接在定义typeMap时,为每个键创建新的map:
typeMap := map[string]map[string]int{ "wlan": {"rx": 0, "tx": 0}, "ether": {"rx": 0, "tx": 0}, "bridge": {"rx": 0, "tx": 0}, "wg": {"rx": 0, "tx": 0}, }
方法2:循环批量初始化
如果需要处理的类型较多,可以用循环批量创建独立的子map,避免重复代码:
types := []string{"wlan", "ether", "bridge", "wg"} typeMap := make(map[string]map[string]int, len(types)) for _, t := range types { typeMap[t] = map[string]int{"rx": 0, "tx": 0} }
修改后的完整代码示例
package main import ( "encoding/json" "fmt" ) func main() { data := []byte(` [{"id":"*1","actual-mtu":"1500","default-name":"ether1","disabled":"false","l2mtu":"1514","type":"ether"},{"id":"*2","actual-mtu":"1500","default-name":"bridge2","disabled":"false","l2mtu":"1514","type":"bridge"}] `) var dst []map[string]string json.Unmarshal(data, &dst) // 使用方法1初始化独立子map typeMap := map[string]map[string]int{ "wlan": {"rx": 0, "tx": 0}, "ether": {"rx": 0, "tx": 0}, "bridge": {"rx": 0, "tx": 0}, "wg": {"rx": 0, "tx": 0}, } fmt.Println("初始状态:", typeMap) for _, v := range dst { if v["type"] == "ether" { typeMap["ether"]["rx"] += 1 typeMap["ether"]["tx"] += 1 } } fmt.Println("更新后状态:", typeMap) }
预期输出
初始状态: map[bridge:map[rx:0 tx:0] ether:map[rx:0 tx:0] wg:map[rx:0 tx:0] wlan:map[rx:0 tx:0]] 更新后状态: map[bridge:map[rx:0 tx:0] ether:map[rx:1 tx:1] wg:map[rx:0 tx:0] wlan:map[rx:0 tx:0]]
内容的提问来源于stack exchange,提问作者Claudiu Mihai
相关产品推荐
相关产品推荐

