2014-04-23 45 views

回答

2

看你的函數的聲明:

func (c *MyGui) Receive(in <-chan *MessageBroker) { 

我們可以看到,<-in會給你*MessageBroker類型的值,指向一個MessageBroker結構。

把該符號的指針值前將取消對它的引用(見Go spec

這意味着*<-in將取消引用指針*MessageBroker,給你MessageBroker類型的值。

所以,看你的例子再次:

//var mb MessageBroker = *<-in // mb is explicitly declared as a MessageBroker 
mb := *<-in // mb is implicitly declared as a MessageBroker using short variable declaration 
//mb := <-in // mb is implicitly declared as a *MessageBroker pointer. 

因此,兩個第一選擇是相同的,但第三個會mb是一個指針,而不是結構。在你的特定情況下,它是否是一個指針並不重要;你只是在打印Message

然而,不同的是,如果你要更改消息:

mb.Message := "New message" 

如果Mb爲MessageBroker型的,一個struct值,則改變將只是本地MB變化的,但在接收功能之外沒有效果。

但是,如果mb的類型爲*MessageBroker,您將更改通過通道接收的對象的相同實例。

+0

現在我明白了,說明我的第四例(未公佈)的行爲背後: VAR MB * MessageBroker = <-in – samwise

+0

是的,這是我還添加了例如3的明確的版本是什麼樣的後果的兩個可能有。在你的情況下,沒有。但在其他情況下,它肯定會有所作爲。 – ANisus