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

可以将双向通道赋值给单向通道,不能将单向通道赋值给双向通道

0
0

ccmouse

2020-03-22

这个好比我有一个var rw io.ReadWriter
可以把他赋值给 var r io.Reader = v
但反过来不行,把一个只可发送的channel赋值给一个可发可收的channel类型就不可以。
在编译执行的语言中,我们赋值前后的"东西"可以是一样的,但是它的类型在等号两边可以不一样。用比较受限的类型来接收赋值后,被编译器保证它不能做过多的事。return和赋值原理是一样的。我从这个返回的channel接收数据,在运行时未必不可以(这点我还未验证),但由于编译会出错,你没有机会运行这样的代码。

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程