一尘不染

主要功能是goroutine吗?

go

main()函数是goroutine吗?例如,我看到了如下的崩溃堆栈跟踪,这让我问:

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

阅读 189

收藏
2020-07-02

共1个答案

一尘不染

是的,主要功能在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中不需要太多,因为还有其他原语。

因此,根据此官方文档,main可以在 当前goroutine中 运行。


现在让我们玩些乐趣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

注意:上面的代码仅用于清楚地表达我的观点,不适用于生产(使用全局变量不应该是首选)。

2020-07-02