如何在Go中将结构体添加到结构体数组

10

在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(类型为 *Message)用作 append 中的类型 Message

为什么 append() 不工作(我可能会从 JavaScript 的 array.concat() 中期望),或者 new() 不起作用?

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


看看在 msg 后面添加 ... 是否有帮助 (https://dev59.com/Cmoy5IYBdhLWcg3wkO-g) - VortixDev
2个回答

8

请将这3行代码更改

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

为了

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

一切都应该正常运作。 new 创建了一个指向 Message 的指针。你的切片不是 Message 指针的切片,而是 Message 切片。


6

在您的代码中,Messages 是一个 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 的访问方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接