如何 "keep main thread running" 即使在 Golang 中发生了 "runtime error" 例程?

How to "keep main thread running" even though routine has "runtime error" occurred in Golang?

我是 Goland 的新手,我过去曾 Java。我写了一个 Golang 函数来计算结果的整数部分。我在想的是使用计时器进行计算并生成随机数。但我遇到的一个问题是,如果例程出现错误,主线程将停止。有什么办法可以保持主线程运行ning?就算套路有错误?

下面是测试代码:

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的错误处理让我很迷惑,我想的是错误发生在"thread",main函数只是负责创建线程和分配任务,应该没关系"threads" 中是否有异常发生,main 应该一直继续下去。如果我在 Java 中这样做,我可以使用 try catch 包围

try{
    result = 1/divisor;
}
catch(Exception e){
    e.printTrace();
}

即使我每次在单独的线程中给除数赋0值,主进程也不会退出,但是对于Golang,我觉得

go calculate(divisor)

正在打开一个新的 "thread" 和 运行 计算 "thread"里面可是为什么主进度会退出。 有什么方法可以防止主进度退出吗?

谢谢。

使用延迟/恢复功能

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)
}