【问题标题】:Embed channel in struct在结构中嵌入通道
【发布时间】:2014-10-04 15:11:03
【问题描述】:

如何在Go 的结构中嵌入通道?

为什么map语法不一致:

var m map[string]int

和频道,

var m chan int

?

为了澄清,在 Go 中可以将一个类型嵌入到另一个类型中。嵌入类型可以访问嵌入类型上定义的所有方法,但也可以通过类型名称显式引用嵌入类型。因此,映射类型声明和通道类型声明之间的不一致会让想要引用嵌入式通道类型的人感到困惑。

【问题讨论】:

标签: go


【解决方案1】:

问题在于 embedding 主要让您从嵌入类型的方法中受益(如“Embedding instead of inheritance in Go”中所述)

channelmap 一样,是一个unnamed type(使用类型文字指定,它由现有类型组成一个新类型。)。
它没有自己的方法或导出字段,因此您不会通过在struct {} 中嵌入channel 类型走得太远。

您可能会收到与example 中类似的错误消息:

func (x chan int) m2() {}
invalid receiver type chan int (chan int is an unnamed type)

如果在struct 类型中嵌入channel 类型有效,则该未命名类型将能够充当receiver for methods,这似乎是该语言一开始就不允许的。

【讨论】:

  • 感谢您真正努力理解问题并提供有意义的答案。我希望嵌入通道的原因是,例如,能够直接接收或发送到通道的嵌入器,而不必显式引用它。但我想这不适用于不是命名类型上的方法的内置操作。谢谢你的回答。
  • @erjoalgo 确实,这是一个有效的请求(我从没想过实际上尝试在 struct 类型中嵌入 channel 类型)。但是这些未命名类型的使用方式并不好。
  • 是的。我正在做的是实现一个带有方法的自定义通道,但如果我的自定义通道可以嵌入一个通道并使用c<-1 语法直接接收/发送,那就太好了。目前,我必须做c.c-1,看起来不太优雅。
  • @erjoalgo 我刚刚编辑了答案以添加“无效的接收器类型”错误消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多