gpt4 book ai didi

go - 在 new func 中运行 goroutine 或不在 recover 之间的区别

转载 作者:IT王子 更新时间:2023-10-29 02:29:45 28 4
gpt4 key购买 nike

它是关于延迟和恢复,以捕获运行时错误。

版本 1:

func a() {
defer func() {
if r := recover(); r != nil {
fmt.Println(r)
}
}()
b()
}

func b() {
go fmt.Println([]string{}[2])
}

func main() {
a()
time.Sleep(1 * time.Second)
fmt.Println("end")
}

版本 2(只有 func b() 改变了):

func b() {
go func() {
fmt.Println([]string{}[2])
}()
}

区别运行版本 1:

> go run /tmp/version1.go 
runtime error: index out of range
end

和版本 2:

> go run /tmp/t.go 
panic: runtime error: index out of range

goroutine 5 [running]:
main.b.func1()
/tmp/t.go:19 +0x109
created by main.b
/tmp/t.go:20 +0x2b

goroutine 1 [sleep]:
time.Sleep(0x3b9aca00)
/usr/local/go/src/runtime/time.go:59 +0xf9
main.main()
/tmp/t.go:25 +0x29
exit status 2

为什么看起来不一样?如果有人能给我详细信息,谢谢。

最佳答案

在版本 1 中,您的 panic 发生在主 goroutine 中,因为 []string{}[2] 必须在生成 goroutine 之前解决。

一个函数的所有参数都必须在它被分派(dispatch)之前解析,goroutines 也不异常(exception)。

goroutine 的工作原理与任何其他函数调用基本相同,只是在为调用设置堆栈后,它在单独的上下文(线程)中执行。

在你的第二个例子中,你正在调用一个没有参数的函数,然后在那个函数中你会 panic 。由于在 goroutine 中没有调用 recover(),您看到的是默认的 panic 处理程序。

defer/recover() 只能捕获同一个 goroutine 中的 panic。

如果你在 b 的顶部添加一个 defer/recover ,你将能够捕获它并做任何事情(即:打印它就像你在#1 中所做的那样)

关于go - 在 new func 中运行 goroutine 或不在 recover 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36051562/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com