我正在运行以下go code并且它不会产生输出:
package main
import "fmt"
//import "strconv"
import "time"
func Wait(){
time.Sleep(2000 * time.Millisecond)
}
func Print(c chan string){
fmt.Println("Running Print go-routine")
for{
fmt.Println("len(c): ", len(c))
str := <- c
fmt.Println(str)
}
}
func main() {
c := make(chan string, 4)
c <- "0"
c <- "1"
c <- "2"
c <- "3"
Wait()
fmt.Println("Before go Print(c)")
go Print(c)
fmt.Println("After go Print(c)")
}
有僵局吗? Print(c)
函数甚至没有调用......?这对我来说很奇怪。
go playground中的链接是:http://play.golang.org/p/tDjEJKwkRJ
答案 0 :(得分:2)
没有错误,在goroutine中调用Print()函数,但主程序在此之后立即退出...所以goroutine终止。
阅读此演讲:Go Concurrency Patterns(或更好,view it's video),了解频道和goroutine的工作原理。
请记住,当main函数返回时程序已完成。
答案 1 :(得分:2)
当main
函数调用返回时,程序退出。它不会等待其他(非main
)goroutines完成。
稍后在Wait
声明后调用go Print(c)
函数。例如,
package main
import (
"fmt"
"time"
)
func Wait() {
time.Sleep(2000 * time.Millisecond)
}
func Print(c chan string) {
fmt.Println("Running Print go-routine")
for {
fmt.Println("len(c): ", len(c))
str := <-c
fmt.Println(str)
}
}
func main() {
c := make(chan string, 4)
c <- "0"
c <- "1"
c <- "2"
c <- "3"
fmt.Println("Before go Print(c)")
go Print(c)
Wait()
fmt.Println("After go Print(c)")
}
输出:
Before go Print(c)
Running Print go-routine
len(c): 4
0
len(c): 3
1
len(c): 2
2
len(c): 1
3
len(c): 0
After go Print(c)
The Go Programming Language Specification
通过链接单个未经插入的包来创建完整的程序 用它导入的所有包调用主包, 及物动词。主包必须具有包名main和声明 一个函数main,它不带参数,也不返回任何值。
func main() { … }
程序执行从初始化主程序包开始,然后 调用函数main。当该函数调用返回时, 程序退出。它不等待其他(非主要)goroutines 完整。