如何在Go中为结构数组添加结构

时间:2016-07-19 04:57:41

标签: arrays go struct

在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(类型*消息)作为附加类型的消息

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

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

2 个答案:

答案 0 :(得分:5)

更改这3行

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

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

一切都应该有效。 new创建指向Message的指针。您的切片不是消息指针的一部分,而是一片消息。

答案 1 :(得分:3)

在您的代码中,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 mgs
}

或者,您可以将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访问权限。