面试题答案
一键面试在Go语言中,可以使用defer
和recover
来捕获并恢复panic
。结合sync包
中的WaitGroup
来等待所有goroutine
完成。以下是代码示例:
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
defer func() {
if r := recover(); r != nil {
fmt.Printf("goroutine %d panicked: %v\n", id, r)
}
}()
// 模拟可能发生panic的操作
if id == 2 {
panic("simulated panic")
}
fmt.Printf("goroutine %d is running\n", id)
}
func main() {
var wg sync.WaitGroup
numGoroutines := 3
for i := 1; i <= numGoroutines; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait()
fmt.Println("All goroutines have finished")
}
代码分析
worker
函数:defer wg.Done()
:在goroutine
结束时,通知WaitGroup
该goroutine
已完成。- 使用
defer
和recover
:defer
函数会在worker
函数结束时执行,recover
会捕获到panic
,并输出错误信息,从而恢复goroutine
的运行,不影响其他goroutine
。
main
函数:- 使用
WaitGroup
来等待所有goroutine
完成。 - 启动多个
goroutine
执行worker
函数,worker
函数内部模拟了可能发生panic
的情况。 - 当所有
goroutine
完成后,main
函数输出“All goroutines have finished”。
- 使用