登录
首页 >  Golang >  Go问答

无法给空映射中的字段分配条目

来源:stackoverflow

时间:2024-03-14 20:48:31 454浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《无法给空映射中的字段分配条目》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

有人知道为什么这不起作用吗?

我已经绞尽脑汁大约四个小时了。我无法让它发挥作用。

在我看来,我正在尝试做同样的事情两次。我正在制作结构中字段的映射,然后在不同结构中的另一个字段上再次执行此操作。

如果我尝试制作地图。它失败并显示:“无法分配给结构字段。bet.events[“one”]。地图中的跑步者”。

因此,如果我删除 make,然后尝试分配它,我会得到:“分配给 nil 映射中的条目”

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",
    }
}

解决方案


map 的默认值是 nil (在 make(map) 之前或没有 make(map) 之前)

您在此代码中为 runners 设置默认值:

bet.events["one"] = event{
    name: "first",
}

因此,runners 没有明确定义,并且设置为 nil

除映射元素外,结构体都是可变的。 (来自@icza的下面评论:“结构是可修改的。存储在映射中的值是不可修改的,因为存储在映射中的值是不可寻址的。”)
您无法重新初始化地图元素 bet.events["one"],因为它不可寻址。

你需要做:

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

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

今天关于《无法给空映射中的字段分配条目》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>