为什么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的闭包代码
怎么样?是否已经明白了
....................................
尽管对于上面这个用例来说,使用通道传送传输通道这种方式并非是最有效的实现方式,但是这种方式肯定有最适合它的用武之地。