该main()函数是goroutine吗?例如,我看到了如下的崩溃堆栈跟踪,这让我问:
main()
goroutine 1 [running]: main.binarySearch(0x0, 0x61, 0x43, 0xc420043e70, 0x19, 0x19, 0x10) /home/---/go/src/github.com/----/sumnum.go:22 +0x80 main.main() /home/---/go/src/github.com/---/sumnum.go:13 +0xc1 exit status 2
是的,主要功能在goroutine(主要程序)中运行。
根据https://tour.golang.org/concurrency/1
goroutine是Go运行时管理的轻量级线程。 go f(x, y, z) 开始 运行 新的goroutinef(x, y, z)。对f,x,y和z的求值发生在 当前goroutine中 ,而执行则f发生在 新的goroutine中 。 Goroutine在相同的地址空间中运行,因此必须同步访问共享内存。同步包提供了有用的原语,尽管您在Go中不需要太多,因为还有其他原语。
go f(x, y, z)
f(x, y, z)
f
因此,根据此官方文档,main可以在 当前goroutine中 运行。
main
现在让我们玩些乐趣main并运行它(因此, 当前的goroutine 运行 新的goroutine ),因此,在这里,我们有 多个goroutine 可以main()再次执行!(注意:对共享内存的访问必须同步):
package main import ( "fmt" "time" ) var i = 3 func main() { if i <= 0 { return } i-- fmt.Println("Hi") go main() time.Sleep(100 * time.Millisecond) }
输出:
Hi Hi Hi
让我们使用main()( 一个goroutine- 无需同步)来计算阶乘:
package main import "fmt" func main() { if f <= 0 { fmt.Println(acc) return } acc *= f f-- main() } var f = 5 var acc = 1
120
注意:上面的代码仅用于清楚地表达我的观点,不适用于生产(使用全局变量不应该是首选)。