Go中通道的类型别名很奇怪

伊万·维利奇科(Ivan Velichko)

我想通过渠道来组织两个功能之间的通信。被叫方只能将数据发送到通道,而被叫方将在通道中等待数据select我想在被叫方签名中显示此限制。我想要的另一件事是使用通道的类型别名。例如,不是让chan string我想使用MsgChan定义为type MsgChan chan string我遇到了问题-如果取消注释行,下面的代码将无法编译test1(make(Ch))

package main

import "fmt"

type Ch chan int
type ChIn chan<- int

func test1(in ChIn) {
    fmt.Println(in)
}

func test2(in chan<- int) {
    fmt.Println(in)
}

func main() {
    //test1(make(Ch))
    test1(make(chan int))
    test2(make(Ch))
    test2(make(ChIn))
}

我不明白为什么我不能使用这种方法?

icza

test1()有一个类型的参数ChIn这是一个命名类型。您要传递一个类型的值,Ch是双向通道类型,也是一个命名类型。

因此,为了对此进行编译,Ch应该将type的值分配给ChIn语言规范不允许这样做。

引用可分配性(突出显示此处适用的那一项):

在以下任何一种情况下,都可以将值x分配给类型变量T(“x可以分配给T”):

  • x的类型与相同T
  • x的类型,V并且T具有相同的基础类型,并且至少是一种VT不是命名类型。
  • T是接口类型并x 实现 T
  • x是双向通道值,T是通道类型,x的类型,V并且T具有相同的元素类型,并且至少是命名类型之一VT不是命名类型。
  • x是预先声明的标识符,nil并且T是指针,函数,切片,映射,通道或接口类型。
  • x可由type值表示的无类型常量T

如果尝试传递未命名类型但具有相同基础类型的值,则可以使其起作用,这可以通过使用类型转换来实现,例如:

test1((chan int)(make(Ch)))

但是上述转换将破坏具有命名Ch类型的目的(因为您必须重复其类型文字才能将其转换为未命名类型,以便可以将其传递给test1())。

您应该做的是不要隐藏类型是通道(不要包含chan在类型声明的类型文字中),而应为通道的元素类型创建一个新类型,例如:

type Msg int

func test(in chan<- Msg) {
    fmt.Println(in)
}

func main() {
    test(make(chan Msg))
    test(make(chan<- Msg))

    ch := make(chan Msg)
    chIn := (chan<- Msg)(ch)
    test(chIn)
}

Go Playground上尝试一下

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Go中强制转换为类型别名?

来自分类Dev

Rust中的类型别名

来自分类Dev

Scala中的类型别名

来自分类Dev

TypeScript中的类型别名

来自分类Dev

Scala 中的类型别名

来自分类Dev

从Scala中的类型别名创建对象

来自分类Dev

类型别名在类中做什么?

来自分类Dev

类型别名在类中做什么?

来自分类Dev

Haskell中的多态类型别名

来自分类Dev

对象中的Scala类型别名

来自分类Dev

Swift 中的类型别名闭包

来自分类Dev

类型别名错误

来自分类Dev

输入Elm中其他类型列表的类型别名

来自分类Dev

类型别名与类型相同

来自分类Dev

您何时在流中的类型别名上使用接口?

来自分类Dev

定义其他协议中声明的类型别名

来自分类Dev

TypeScript中可以使用通用类型别名吗?

来自分类Dev

如何使用mgo从文档中解组命名类型别名?

来自分类Dev

如何在Swift中“生成”闭包类型别名?

来自分类Dev

在类型别名中声明未知数量的列表

来自分类Dev

从派生类访问基类中的类型别名

来自分类Dev

如何在TypeScript中声明全局类型别名?

来自分类Dev

模板类类型别名在成员声明中替换失败

来自分类Dev

具有类型别名的协议中的AssociatedType

来自分类Dev

如何在Flutter中创建类型别名?

来自分类Dev

定义其他协议中声明的类型别名

来自分类Dev

函数中的类型别名是否可以提高 Python 性能?

来自分类Dev

删除类型别名 Swift 数组中的元素

来自分类Dev

Typeof / instanceof类型别名