golang 中如何给map中的struct 赋值,急急急!!!!

求大神指教

package main

import (
    "fmt"
)

type User struct {
    name string
    age  int
}

func main() {

    test := map[int]User{1: User{"zhang", 10}, 2: User{"li", 9}}

    test[1].name = "zhao"

    fmt.Println(test)

    /*
        这种方式也行,但是我要用协程,数据要共享,so,不能用以下方式
        tmp := test[1]
        tmp.name = "zhao"
        test[1] = tmp
        fmt.Println(test)

    */

}

会报错
./test3.go:16: cannot assign to test[1].name

阅读 18.7k
4 个回答
   tmp := test[1]
   tmp.name = "zhao"
   test[1] = tmp

这种用法在goroutine 中使用时在map 上加上锁也没有问题吧

test := map[int]*User{1: &User{"zhang", 10}, 2: &User{"li", 9}}
test[1].name = "zhao"

用指针的话应该更好一点吧,不过也存在data race,需要加锁

struct是值语义,test[1]取出来的是User的副本,对这个副本的修改不会影响到map里的User

所以有2个选择:

1,使用临时变量,每次取出来后再设置回去

tmp:=test[1]
tmp.name="zhao"
test[1]=tmp

2,map的value用User的指针类型

test := map[int]*User{}
test[1] = &User{"zhang", 10}
test[1].name = "zhao"

如果打算在协程中对共享的map进行写操作,那么你需要加锁保证安全性, 可以使用sync.RWMutex, 读的时候使用读锁,写的时候使用写锁。

tmp:=test[1]
tmp.name="zhao"
test[1]=tmp

这样子就可以了吧

map里面的struct只取值,不能赋值
tmp:=test[1].name
这样子是可以的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题