gpt4 book ai didi

go - 为什么 channel 的方向变化不能兼容?

转载 作者:IT王子 更新时间:2023-10-29 01:19:39 35 4
gpt4 key购买 nike

我喜欢尽可能限制性地编程提供接口(interface),既可以避免错误使用,也可以明确和 self 记录。

因此,我喜欢在应该由用户单向使用时提供定向 channel ,但当然,在内部我有一个双向 channel 副本。

以下作品的分配:

var internal chan int
var external <-chan int
external = internal

但现在我想向用户提供一个<-chan chan<- int类型(在函数的返回中),但以下内容不起作用:

var internal chan chan int
var external <-chan chan<- int
external = internal // this fails

我有两个问题:

  • 到底为什么不起作用?
  • 因此,我可以声明一个变量 <-chan chan<-类型,但是......在任何实际意义上都不能使用这样的类型吗? (因为即使有定向 channel ,它们 AFAIK 也用于双向 channel 的编排,并且由于不可能分配,因此不能以这种方式使用它们)

最佳答案

这行不通的原因

规范说明了关于 channel assignability 的内容:

A [channel] value x is assignable to a variable of type T ("x is assignable to T") [when] x is a bidirectional channel value, T is a channel type, x's type V and T have identical element types, and at least one of V or T is not a named type.

这准确反射(reflect)了您的体验:

  • chan (chan int)<- chan (chan int)作品
  • chan (chan int)<- chan (chan<- int)没有

原因是元素类型(chan 关键字之后的那些)不相等。

我可以申报但不能使用?

可以使用它,但不是您想要的方式。无法分配变量你做的方式,但通过更正元素类型,你确实可以使用它:

var internal chan chan<- int
var external <-chan chan<- int
external = internal

如果您只有 chan chan int输入您需要复制的值(Examples on play):

var internal chan chan int
var internalCopy chan chan<- int

go func() { for e := range internal { internalCopy <- e } }()

var external <-chan chan<- int
external = internalCopy

关于go - 为什么 channel 的方向变化不能兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20513661/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com