今日看到了如下代码:
func main() {
data := map[string]any{
"input": 123,
}
tmpMap := map[string]any{
"hhh": 789,
}
data["tmp"] = tmpMap
// 注意这一行在data["tmp"]赋值的后面
tmpMap["test"] = 456
fmt.Println(data)
}
最后输出的结果是:
map[input:1 tmp:map[hhh:789 test:456]]
可以看到相当于引用传递;
在此情况下,比如要进行遍历时的修改:
func main() {
data := map[string]any{
"input": 123,
}
tmpMap := map[string]any{
"hhh": 789,
}
data["tmp"] = tmpMap
tmpMap["test"] = 456
for _, v := range data {
if v == 123 {
v = 234
}
}
fmt.Println(data)
}
结果为:
map[input:123 tmp:map[hhh:789 test:456]]
可以看到没有生效,理解起来应该是遍历的时候进行了值拷贝;那么如果要修改应该怎么处理呢?
func main() {
data := map[string]any{
"input": 123,
}
tmpMap := map[string]any{
"hhh": 789,
}
data["tmp"] = tmpMap
tmpMap["test"] = 456
for k, v := range data {
if v == 123 {
data[k] = 234
}
}
fmt.Println(data)
}
可以看到这样能够实现
如果map的value是个结构体,且需要改动结构体中的某个字段的值,就需要如下的方法了:
type tmplItem struct {
test1 string
test2 int64
test3 map[string]any
}
func main() {
data := map[string]any{
"input": 123,
}
tmpMap := map[string]any{
"hhh": 789,
}
data["tmp"] = tmpMap
tmpMap["test"] = 456
var midi = tmplItem{
test1: "hello",
test2: 1010,
test3: map[string]any{"test3": "test3"},
}
data["midi"] = &midi
for k, v := range data {
if k == "midi" {
v.(*tmplItem).test2 = 1111
}
}
fmt.Println(*data["midi"].(*tmplItem))
}
输出结果:
{hello 1111 map[test3:test3]}