createWorke 返回值类型问题
来源:11-1 channel

aznmoe
2020-03-19
createWorke 代码如下
func createWork(id int) chan<- int {
ch := make(chan int)
go func() {
for {
fmt.Printf("worker %d received %c\n", id, <-ch)
}
}()
return ch
}
ch
类型为 chan int
,而 返回值类型为 chan<- int
,前者可发送可接受,后者仅可发送。
两者类型不一样了吧,但在运行的时候并没有出错,这个是 channel 的 特例么。
写回答
2回答
-
hen_nam
2021-12-26
可以将双向通道赋值给单向通道,不能将单向通道赋值给双向通道
00 -
ccmouse
2020-03-22
这个好比我有一个var rw io.ReadWriter
可以把他赋值给 var r io.Reader = v
但反过来不行,把一个只可发送的channel赋值给一个可发可收的channel类型就不可以。
在编译执行的语言中,我们赋值前后的"东西"可以是一样的,但是它的类型在等号两边可以不一样。用比较受限的类型来接收赋值后,被编译器保证它不能做过多的事。return和赋值原理是一样的。我从这个返回的channel接收数据,在运行时未必不可以(这点我还未验证),但由于编译会出错,你没有机会运行这样的代码。00
相似问题