通过来自通道值的指针赋值给局部变量

时间:2014-04-23 01:34:22

标签: go

此处代码:http://play.golang.org/p/WjpgN_0AaP

在第45,46和47行,有三种不同的方法可以从消息代理中提取值。

//var mb MessageBroker = *<-in
mb := *<-in
//mb := <-in    

所有这三个都具有完全相同的结果。选择一种方式而不是另一种方式有什么意义?另外,我很困惑为什么星号看起来没什么区别。

1 个答案:

答案 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,则您将更改通过该频道收到的对象的同一实例。