3 回答

TA貢獻1804條經驗 獲得超3個贊
因為程序在到達 結束時退出func main
,無論是否有其他 goroutine 正在運行。一旦第二個函數從end
通道接收到, main 在該通道上的發送就會被解除阻塞并且程序完成,然后接收到的值有機會被傳遞給Println
。

TA貢獻2021條經驗 獲得超8個贊
除了必須指定時間的 sleep 之外,您還可以使用 waitgroup 使您的程序等待 goroutine 完成執行。
package main
import "fmt"
import "sync"
var wg sync.WaitGroup
func main() {
start := make(chan int)
end := make(chan int)
wg.Add(2)
go func() {
defer wg.Done()
fmt.Println("Start")
fmt.Println(<-start)
}()
go func() {
defer wg.Done()
fmt.Println("End")
fmt.Println(<-end)
}()
start <- 1
end <- 2
wg.Wait()
}

TA貢獻1895條經驗 獲得超7個贊
最終值不會被打印出來,因為一旦maingoroutine(該main函數實際上是一個 goroutine)完成(換句話說,被解除阻塞)其他非主 goroutines 就沒有機會完成。
當函數 main() 返回時,程序退出。此外,goroutines 是獨立的執行單元,當它們中的一些一個接一個啟動時,你不能依賴 goroutine 何時實際啟動。您的代碼邏輯必須獨立于調用 goroutine 的順序。
解決您的問題的一種方法(在您的情況下是最簡單的方法)是將 atime.Sleep放在main()函數的末尾。
time.Sleep(1e9)
這將保證主 goroutine 不會解除阻塞,并且其他 goroutine 將有更改以執行。
package main
import (
"fmt"
"time"
)
func main() {
start := make(chan int)
end := make(chan int)
go func() {
fmt.Println("Start")
fmt.Println(<-start)
}()
go func() {
fmt.Println("End")
fmt.Println(<-end)
}()
start <- 1
end <- 2
time.Sleep(1e9)
}
您提到的另一個解決方案是使用waitgroup.
- 3 回答
- 0 關注
- 154 瀏覽
添加回答
舉報