defer

20230224日志

2023年2月24日
2023
202302, go, defer

go # err总是通过最后一个返回值返回 panicking # panic可以被recover恢复, recover仅可以在defer中, 即使发生panic,defer也会执行 节省的使用panic, 在programmer error或者dependency场景中使用 func main(){ defer fun(){ if f := recevoer(); r != nil { fmt.Println("recover", r) } }() f() } func f(){ fmt.Println("a") panic("foo") fmt.Println("b") } ignoring when to wrap an error # 需要添加额外信息;把error作为特定的一种error 老式的方式,通过struct包装 type BarError struct { Err error } func (b BarError) Error() string { return "bar failed:" + b.Err.Error() } 通过%w添加上下文, 可以unwrap if err ! ...

20230222日志

2023年2月22日
2023
202302, go, defer

go # defer: in a loop # func readFiles(ch <-chan string) error { for path := range ch { file, err := os.Open(path) if err != nil { return err } defer file.Close() // Do something with file } return nil } 方案1, 将file的open与close封装在独立函数, 循环中不defer 方案2, 循环内创建闭包调用, 在闭包中defer defer: ignoring how defer arguments and receivers are evaluated # func f() error { var status string defer notify(status) defer incrementCounter(status) if err := foo(); err ! ...