【问题标题】:How to add a struct to an array of structs in Go如何在 Go 中将结构添加到结构数组中
【发布时间】:2021-06-17 11:27:05
【问题描述】:

在 golang 中,我正在尝试创建一个消息数组,并能够轻松地将新的“对象”添加到数组中。

type Message struct {
    Name string
    Content string
}

var Messages = []Message{
    {
        Name: "Alice",
        Content: "Hello Universe",
    },{
        Name: "Bob",
        Content: "Hello World",
    },
}

func addMessage(m string) {
    var msg = new(Message)
    msg.Name = "Carol"
    msg.Content = m
    Messages = append(Messages, msg)
}

在构建时,我收到一条错误消息:

不能使用 msg (type *Message) 作为类型 Message in append

为什么append() 不起作用(正如我对JavaScript 的array.concat() 所期望的那样),或者new() 不起作用?

欢迎任何其他关于如何改进此代码的提示,因为我显然是 Go 新手。

【问题讨论】:

标签: arrays go struct


【解决方案1】:

改变这 3 行

var msg = new(Message)
msg.Name = "Carol"
msg.Content = m

msg := Message{
    Name:    "Carol",
    Content: m,
}

一切都应该正常。 new 创建一个指向 Message 的指针。您的切片不是消息指针切片,而是消息切片。

【讨论】:

    【解决方案2】:

    在您的代码中,MessagesMessage 类型的切片,而您正试图将 Message 类型 (*Message) 的指针附加到它。

    您可以通过执行以下操作来修复您的程序:

    func addMessage(m string) {
        var msg = new(Message) // return a pointer to msg (type *msg)
        msg.Name = "Carol"
        msg.Content = m
        Messages = append(Messages, *msg) // use the value pointed by msg
    }
    

    或者,您可以将Messages 声明为*Message 的切片:

    var Messages = []*Message{
        &Message{ // Now each entry must be an address to a Message struct
            Name: "Alice",
            Content: "Hello Universe",
        },
        &Message{
            Name: "Bob",
            Content: "Hello World",
        },
    }
    

    在上述情况下,addMessage 不需要任何更改。但是您必须修改Messages 其他任何地方的访问权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 2020-10-01
      • 2013-08-07
      • 2020-02-01
      • 1970-01-01
      相关资源
      最近更新 更多