您的问题实际上有两部分:如何在Go中排队数据,以及如何在不阻塞的情况下使用通道。对于第一部分,听起来您需要做的是代替使用通道将内容添加到队列中,而是将通道用作队列。例如:var ( ch = make(chan int) // You can add an int parameter to this make call to create a buffered channel // Do not buffer these channels! gFinished = make(chan bool) processFinished = make(chan bool))func f() { go g() for { // send values over ch here... } <-gFinished close(ch)}func g() { // create more expensive objects... gFinished <- true}func processObjects() { for val := range ch { // Process each val here } processFinished <- true}func main() { go processObjects() f() <-processFinished}至于如何使其更具异步性,您可以(如cthom06所指出的那样)将第二个整数传递给第二行中的make调用,这将使发送操作异步进行,直到通道的缓冲区已满。编辑:但是(如cthom06也指出),因为您有两个写入通道的goroutine,所以其中之一必须负责关闭通道。另外,我的上一个修订版本将在processObjects完成之前退出。我选择同步goroutine的方式是通过创建几个通过伪值传递的通道,以确保清理正确完成。这些通道没有特别缓冲,因此发送以锁定步骤进行。