此处代码:http://play.golang.org/p/WjpgN_0AaP
在第45,46和47行,有三种不同的方法可以从消息代理中提取值。
//var mb MessageBroker = *<-in
mb := *<-in
//mb := <-in
所有这三个都具有完全相同的结果。选择一种方式而不是另一种方式有什么意义?另外,我很困惑为什么星号看起来没什么区别。
答案 0 :(得分: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
,这是一个结构值,那么更改只是针对本地mb变量,但在Receive函数之外没有任何影响。
但是,如果mb的类型为*MessageBroker
,则您将更改通过该频道收到的对象的同一实例。