Golang 的错误处理

Go 的错误处理一直是初学 Go 开发者不断吐槽的一个点。Go 没有像一般语言那样提供try catch的处理方式,而是通过函数返回值的方式直接返回。 需要不断的进行判断 if err != nil { return err } Rob Pike 也做了说明 Values can be programmed, and since errors are values, errors can be programmed. Rob Pike 在这篇文章里也展示了如果优雅的 handle error。 标准的Error interface Go j的标准包提供了一个 error interface type error interface { Error() string } 创建 error // Example 1 func demo() (bool, error) { return false, errors.New("A new error") } // Example 2 fmt....

May 20, 2021 · 4 min

Golang优雅的退出主线程

当我们想终止一个运行中golang程序, 往往会使用 ctrl+c 或者 kill -9 <pid> 来杀死程序。当我们正在运行一些原子性操作的代码的时候(比如写文件), 这样操作的话可能会导致问题产生。 因此需要有一个优雅的处理方式,等原子性的操作代码处理完后,再终止程序。 可以使用 golang的 os.Signal 来捕获系统的终止操作 sig := make(chan os.Signal) signal.Notify(sig, syscall.SIGINT, syscall.SIGKILL, syscall.SIGTERM) POSIX中定义的信号 使用2个channel通信的方式 func main() { sig := make(chan os.Signal) stopCh := make(chan struct{}) finishedCh := make(chan struct{}) signal.Notify(sig, syscall.SIGINT, syscall.SIGKILL) go func(stopCh, finishedCh chan struct{}) { for { select { case <-stopCh: fmt.Println("stopped") finishedCh <- struct{}{} return default: time.Sleep(time.Second * 10) } } }(stopCh, finishedCh) //程序被挂起 等待singal <-sig stopCh <- struct{}{} //等待子routine 返回 <-finishedCh fmt....

May 15, 2021 · 2 min