在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的新手。
答案 0 :(得分:5)
更改这3行
var msg = new(Message)
msg.Name = "Carol"
msg.Content = m
到
msg := Message{
Name: "Carol",
Content: m,
}
一切都应该有效。 new
创建指向Message
的指针。您的切片不是消息指针的一部分,而是一片消息。
答案 1 :(得分:3)
在您的代码中,Messages
是Message
类型的切片,您尝试向其附加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
访问权限。