在struct中嵌入通道

eal*_*nso 1 go

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

为什么地图语法之间的不一致:

var m map[string]int
Run Code Online (Sandbox Code Playgroud)

和渠道,

var m chan int
Run Code Online (Sandbox Code Playgroud)

?

为了澄清,在Go中可以嵌入另一种类型的类型.在嵌入型收益访问的嵌入式类型定义的所有方法,但它也可以由它的类型的名称来指代嵌入式明确.因此,对于想要引用嵌入式通道类型的人来说,地图类型声明和通道类型声明之间的不一致会让人感到困惑.

Von*_*onC 10

问题是嵌入允许您主要从嵌入类型的方法中受益(如" 在Go中嵌入而不是继承 "中所述)

并且channel,就像map是一个未命名的类型(使用类型文字指定,它从现有类型组成一个新类型.).
它没有自己的方法或导出的字段,所以你不会在一个channel类型中嵌入一​​个类型struct {}.

您可能会有一个类似于此示例中的错误消息:

func (x chan int) m2() {}
invalid receiver type chan int (chan int is an unnamed type)
Run Code Online (Sandbox Code Playgroud)

如果channel在一个struct工作类型中嵌入一​​个类型,那个未命名的类型将能够充当方法的接收者,这首先似乎不被语言所允许.

  • 感谢您真正努力了解问题并提供有意义的答案.我希望嵌入通道的原因是,例如,能够直接接收或发送到通道的嵌入器,而不是必须明确地引用它.但我想这对于不是命名类型的方法的内置操作不起作用.感谢您的回答. (2认同)
  • @erjoalgo确实,这是一个有效的请求(我从未想过实际尝试在`struct`类型中嵌入`channel`类型).但是使用那些未命名的类型的方式,这将不会很好. (2认同)
  • 是啊.我正在做的是在其上实现一个带有方法的自定义通道,但如果我的自定义通道可以嵌入一个通道并使用`c <-1`语法直接接收/发送,那将会很好.目前,我必须做`cc-1`,看起来不那么优雅. (2认同)