Go语言 无法赋值给结构字段/赋值给nilMap中的条目[重复]

cwtwac6a  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(166)

此问题在此处已有答案

How to update map values in Go(3个答案)
四年前关闭了。
有人知道为什么这行不通吗?
我已经绞尽脑汁想了4个小时了,我就是想不通。
在我看来,我试图做同样的事情两次,我在一个结构体中做一个字段的Map,然后我在另一个结构体中的另一个字段上再做一次。
如果我尝试制作Map,则会失败,并显示:“无法分配给结构字段。Bet.Events[“one”]。Map“”中的运行程序。
所以如果我去掉make,然后赋值,我得到:“nilMap中条目的赋值”
https://play.golang.org/p/kRcXoyO-8FN

var Bet BetStruct

type BetStruct struct {
    Events     map[string]Event
}

type Event struct {
    Name       string
    Runners    map[int]Runner
}

type Runner struct {
    Name       string
}

func main(){

    // == THIS WORKS FINE ==
    Bet.Events = make(map[string]Event)

    Bet.Events["one"] = Event{
        Name: "first",
    }
    Bet.Events["two"] = Event{
        Name: "second",
    }

    // == THIS DOES NOT WORK ==
    Bet.Events["one"].Runners = make(map[int]Runner)

    Bet.Events["one"].Runners[0] = Runner{
         Name:  "Jeff",
    }
}
9gm1akwq

9gm1akwq1#

map的默认值为nil(在make(map)之前或不使用make(map))
在以下代码中为Runners设置默认值:

Bet.Events["one"] = Event{
    Name: "first",
}

因此,Runners未明确定义,设置为nil
除了map元素之外,结构是可变的。(来自下面的@icza注解:“结构是可修改的。存储在Map中的值是不可修改的,因为存储在Map中的值是不可寻址的。”)
无法重新初始化Map元素Bet.Events["one"],因为不可寻址。
您需要执行以下操作:

Bet.Events["one"] = Event{
    Name: "first",
    Runners: make(map[int]Runner),
}

感谢@icza标记文本中的错误

相关问题