2016-07-19 15 views
3

golang私はメッセージの配列を作成しようとしており、新しい「オブジェクト」を配列に簡単に追加できます。Goの構造体の配列に構造体を追加する方法

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) 
} 

構築するとき、私はというエラーを取得:

は私がかもしれませんが、なぜappend()(機能していない追記

タイプのメッセージとして

をMSG(タイプ*メッセージ)を使用することはできませんがJavaScriptのarray.concat()から期待)、またはnew()が機能していませんか?

このコードを改善する方法に関するその他のヒントは、私が明らかに新しくなったので歓迎します。

+0

msgの後に追加するかどうかを確認する(http://stackoverflow.com/questions/8461462/how-can-i-use-go-append-with-two-byte-slices-or-arrays) – VortixDev

答えて

1

コードでMessagesは、Messageタイプのスライスで、Messageタイプのポインタ(*Message)を追加しようとしています。あなたが*MessageのスライスとしてMessagesを宣言することができ、また

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 
} 

あなたは以下を実行して、あなたのプログラムを修正することができます上記の場合

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のアクセス権を変更する必要があります。

3

変更これら3行

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

、すべてが動作するはずの

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

newMessageへのポインタを作成します。あなたのスライスはメッセージポインタのスライスではなく、メッセージのスライスです。