2
回答
goroutine的问题
华为云实践训练营,热门技术免费实践!>>>   

/*
摘自: 
https://code.google.com/p/go/source/browse/2013/advconc/buffer/buffer.go?repo=talks
*/
package main

import (
	"fmt"
	"time"
)

func main() {
	in, out := make(chan int), make(chan int)
	go buffer(in, out)

	time.Sleep(4 * time.Second) // -> 添加4秒延迟

	for i := 0; i < 10; i++ {
		in <- i
	}
	close(in) // 会造成in为nil吗? 

	for i := range out {
		fmt.Println(i)
	}

}

func buffer(in <-chan int, out chan<- int) {
	var buf []int // 无限制的缓存

	for in != nil || len(buf) > 0 {
		var i int = 0
		var c chan<- int

		if len(buf) > 0 { // 如果缓存中还有数据,则取出发送。
			i = buf[0]
			c = out
		}
		select {
		case c <- i: // 送出左端数据
			buf = buf[1:]
		case n, ok := <-in: // 取出in管道数据,放入缓存中。
			if ok {
				buf = append(buf, n)
			} else {
				in = nil // 关闭in
			}

		}
	}
}
问题一:如果在16行添加4秒延迟后,14行建立goroutine后为何会产生阻塞?从逻辑上,进入到40行的select后43行会阻塞,但41行的向channel写入数据为何阻塞,起码写第一个数据单元应该无阻塞。

问题二:执行为何报错:

<无标签>
举报
老黄
发帖于4年前 2回/170阅
顶部