我是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应该一直保持下去。如果我在Java中执行此操作,则可以使用try catch将
try{
result = 1/divisor;
}
catch(Exception e){
e.printTrace();
}
即使每次我在单独的线程中给除数0值时,主进程也不会退出,但是对于Golang,我认为
go calculate(divisor)
打开一个新的“线程”并运行计算
里面的“线程”,但是为什么主要的进度会退出。
有什么方法可以防止主要进度退出?
谢谢。
最佳答案
使用延迟/恢复功能
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)
}