看你的函數的聲明:
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
,您將更改通過通道接收的對象的相同實例。
現在我明白了,說明我的第四例(未公佈)的行爲背後: VAR MB * MessageBroker = <-in – samwise
是的,這是我還添加了例如3的明確的版本是什麼樣的後果的兩個可能有。在你的情況下,沒有。但在其他情況下,它肯定會有所作爲。 – ANisus