我是 Goland 的新手,過去我用過 Java。我寫了一個 Golang 函數來計算結果的整數部分。我在想的是使用計時器進行計算并生成隨機數。但我遇到的一個問題是,如果例程出現錯誤,主線程將停止。有沒有辦法讓主線程繼續運行?即使例行程序有錯誤?下面是測試代碼:func main() { ticker := time.NewTicker(1*1000 * time.Millisecond) for _ = range ticker.C { rand.Seed(time.Now().Unix()) divisor := rand.Intn(20) go calculate(divisor) }}func calculate(divisor int){ result:= 100/divisor fmt.Print("1/"+strconv.Itoa(divisor)+"=") fmt.Println(result)}由于Golang的錯誤處理讓我很困惑,我想的是錯誤發生在“線程”中,main函數只是負責創建線程和分配任務,應該不會在乎是否有異常發生“線程”和 main 應該始終保持運行。如果我在 Java 中這樣做,我可以使用 try catch 來包圍try{ result = 1/divisor;}catch(Exception e){ e.printTrace();}甚至每次在單獨的線程中給divisor一個0值,主進程都不會退出,但是對于Golang,我覺得go calculate(divisor)正在開一個新的“線程”,在“線程”里面運行計算,但是為什么主進程會退出。有沒有什么方法可以防止主要進度退出?謝謝。
1 回答

動漫人物
TA貢獻1815條經驗 獲得超10個贊
使用延遲/恢復功能
package main
import (
"fmt"
"time"
"math/rand"
)
func main() {
ticker := time.NewTicker(1*1000 * time.Millisecond)
for _ = range ticker.C {
rand.Seed(time.Now().Unix())
divisor := rand.Intn(20)
go calculate(divisor)
}
fmt.Println("that's all")
}
func calculate(divisor int){
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
}()
result:= 100/divisor
fmt.Printf("1/%d=", divisor)
fmt.Println(result)
}
- 1 回答
- 0 關注
- 124 瀏覽
添加回答
舉報
0/150
提交
取消