【发布时间】:2016-07-03 06:29:34
【问题描述】:
这是关于延迟和恢复,以捕获运行时错误。
版本 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
为什么看起来不一样? 如果有人可以给我详细信息,谢谢。
【问题讨论】:
标签: go deferred goroutine recover