3 回答

TA貢獻1951條經驗 獲得超3個贊
main 函數是 goroutine 嗎?
不。
主要功能是一個功能。
相比之下,
goroutine是一個輕量級的執行線程。
所以goroutines執行的是函數,但是goroutines不是函數,goroutines和函數之間不是一對一的關系。
然而...
該main()
函數在第一個(并且僅在啟動時)goroutine 中執行,goroutine #1
.
但是一旦該函數調用另一個函數,main goroutine 就不再執行 main 函數,而是執行其他函數。
所以很明顯 goroutine 和函數是完全不同的實體。
不要將 goroutines 與函數混為一談!!
函數和協程是完全不同的概念。而將它們視為同一事物會導致無數的困惑和問題。

TA貢獻1828條經驗 獲得超6個贊
是的,主要功能作為 goroutine(主要的)運行。
goroutine 是由 Go 運行時管理的輕量級線程。?
go f(x, y, z)
?啟動一個新的 goroutine 運行f(x, y, z)
f、x、y 和 z 的評估發生在當前 goroutine中,而執行f
發生在新的 goroutine 中。
Goroutines 運行在同一個地址空間,所以對共享內存的訪問必須是同步的。sync 包提供了有用的原語,盡管在 Go 中你不需要太多,因為還有其他原語。
所以根據這個官方文檔,這main
是當前的 goroutine。
準確地說(字面意思)我們可以將 themain
稱為當前 goroutine,所以簡單地說它是一個 goroutine。(注意:從字面上看,這main()
是一個可以作為 goroutine 運行的函數。)
現在讓我們計算使用的 goroutines 的數量runtime.NumGoroutine()
:
作為一個例子,讓我們運行 3 個 goroutines。在線試用:
package main
import (
? ? "fmt"
? ? "runtime"
? ? "time"
)
func main() {
? ? fmt.Println(runtime.NumGoroutine()) // 3
? ? time.Sleep(100 * time.Millisecond)
}
func init() {
? ? go main()
? ? go main()
}
這里當前的 goroutine運行新的 goroutine,所以這里我們有多個 goroutine,它再次執行main()。在線試用:
package main
import (
? ? "fmt"
? ? "runtime"
? ? "sync/atomic"
? ? "time"
)
func main() {
? ? fmt.Println(runtime.NumGoroutine()) // 1 2 3 4
? ? if atomic.LoadInt32(&i) <= 0 {
? ? ? ? return
? ? }
? ? atomic.AddInt32(&i, -1)
? ? go main()
? ? time.Sleep(100 * time.Millisecond)
}
var i int32 = 3
輸出:
1
2
3
4
這里我們有一個maingoroutine 加上 3 個名為 goroutines 的用戶main,所以這里的 goroutine 總數是 4。
讓我們使用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
注意:上面的代碼只是為了清楚地表達我的觀點,不利于生產使用(使用全局變量不應該是首選)。

TA貢獻1853條經驗 獲得超9個贊
是的。Main func 可以生成其他 goroutine,但“main”本身就是一個 goroutine。
package main
import (
"fmt"
"runtime"
)
func main() {
// Goroutine num includes main processing
fmt.Println(runtime.NumGoroutine()) // 1
// Spawn two goroutines
go func() {}()
go func() {}()
// Total three goroutines run
fmt.Println(runtime.NumGoroutine()) // 3
}
- 3 回答
- 0 關注
- 156 瀏覽
添加回答
舉報