为什么Go语言中的通道传输结果与我预期的不符?

发表时间: 2023-09-19 18:06


使用通道传送传输通道

一个通道类型的元素类型可以是另一个通道类型。 在下面这个例子中, 单向发送通道类型chan<- int是另一个通道类型chan chan<- int的元素类型。

package mainimport "fmt"var counter = func(n int) chan<- chan<- int {	requests := make(chan chan<- int)	go func() {		for request := range requests {			if request == nil {				n++ // 递增计数				fmt.Println(n)			} else {				request <- n // 返回当前计数			}		}	}()	return requests // 隐式转换到类型chan<- (chan<- int)}(0)func main() {	increase1000 := func(done chan<- struct{}) {		for i := 0; i < 10; i++ {			counter <- nil		}		done <- struct{}{}	}	done := make(chan struct{})	go increase1000(done)	go increase1000(done)	<-done	<-done	request := make(chan int, 1)	counter <- request	fmt.Println(<-request) // 2000}

上述代码输出:


为什么会是20了,n为什么会累加了,本人基础比较差,别笑话!!!

通过找gpt分析代码得出如下:


原来N是个全局变量,让我联想起来js里面常用的闭包实现计数器(词法分析,作用域)

接下来看一段javascript的闭包代码



怎么样?是否已经明白了
....................................

尽管对于上面这个用例来说,使用通道传送传输通道这种方式并非是最有效的实现方式,但是这种方式肯定有最适合它的用武之地。