【问题标题】:How to append items to a map[string][]Struct如何将项目附加到地图[字符串] []结构
【发布时间】:2020-07-26 13:11:48
【问题描述】:

我正在尝试将项目附加到我拥有的这个结构中:

type AuditSource struct {
    Source      map[string][]Pgm  `json:"Source"`
}

type Pgm struct {
    ID            uint   `json:"id,omitempty"`
    SourceIP      Inet   `json:"sourceip,omitempty"`
    MulticastPort int `json:"multicastport,omitempty"`
}


func NewAuditSource(lid string) (a *AuditSource) {
    a = &AuditSource{
        Id:              make(map[string]uint64),
        Source:          make(map[string][]Pgm),
    }
    return
}

func (as *AuditSource) AuditSourceDifferences(a, b int) bool{

        if a != b {
            as.Source["Primary"][0].MulticastPort =a //ERRORS out every time
            as.Source["Primary"][1].MulticastPort =b 

        }
       return true
}

知道为什么每次我尝试添加一些东西时我的 struct map[string][]Pgm 都会出错吗?我可能需要初始化 []Pgm 吗?

【问题讨论】:

  • 你能发布你看到的错误吗?除非您在其他地方初始化 a.Source["Primary"],否则 a.Source["Primary"] 将为 nil。
  • 您作为错误突出显示的行正在尝试读取索引 0 处的项目,该项目可能不存在,因为您尚未将任何内容附加到切片(这就是您实际向其添加内容的方式)。

标签: go go-map


【解决方案1】:

您似乎已经初始化了地图,因此该错误很可能是因为您正在访问切片中不存在的元素。初始化切片时,它是空的,并且没有第 0 个或第 1 个元素:

src:=a.Source["Primary"]
src=append(src,Pgm{MulticastPort:a})
src=append(src,Pgm{MulticastPort:b})
a.Source["Primary"]=src

【讨论】:

  • 这似乎是不必要的冗长,因为您可以附加到 nil 切片就好了。 a.Source["Primary"] = append(a.Source["Primary"], Pgm{MulticastPort:a}) 可以正常工作。
【解决方案2】:

代码中有一些错误:

  1. Inet 类型未定义
  2. AuditSource 类型不包含在NewAuditSource 函数中使用的Id
  3. AuditSourceDifferences 函数不包含if 语句
  4. 您正在使用AuditSourceDifferences 函数中的索引 0 和 1 附加一个(可能的)不存在的数组值
  5. 您对输入值 (a, b int) 和结构接收器 (a *AuditSource)) 使用了相同的名称 (a)

试试下面的代码

package yourPackage

type AuditSource struct {
    Source map[string][]Pgm `json:"Source"`
    Id     map[string]uint64
}

type Pgm struct {
    ID            uint `json:"id,omitempty"`
    SourceIP      Inet `json:"sourceip,omitempty"`
    MulticastPort int  `json:"multicastport,omitempty"`
}

func NewAuditSource(lid string) (a *AuditSource) {
    a = &AuditSource{
        Id:     make(map[string]uint64),
        Source: make(map[string][]Pgm),
    }
    return
}

func (a *AuditSource) AuditSourceDifferences(i, j int) bool {
    if i != j {
        a.Source["Primary"] = append(a.Source["Primary"], Pgm{MulticastPort: i},Pgm{MulticastPort: j})
    }
    return true
}

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 2012-01-12
    • 2017-05-15
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多