当程序发生崩溃时只会调用当前 Goroutine 的延迟调用函数也是非常合理的

在其他goroutine中发生panic不recover,会导致整个程序退出(不仅仅是退出该问题goroutine)

当前gorotuinepanic,必须在当前goroutine recover

下面这段代码会发生什么? (为什么不输出 in main ?)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package main

import (
	"time"
)

func main() {
	defer println("in main")
	go func() {
		defer println("in goroutine ")
		panic("")
	}()

	time.Sleep(1 * time.Second)
}

下面这段代码输出什么? (recover要放在defer里)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
	"fmt"
)

func main() {
	defer fmt.Println("in main")
	if err := recover(); err != nil {
		fmt.Println(err)
	}

	panic("unknown err")
}



$ go run main.go
in main
panic: unknown err

goroutine 1 [running]:
main.main()
	...
exit status 2