上一篇文章《Go语言开发基础系列(十五)初始化及init函数》我们介绍了程序的初始化,和初始化相对应的就是优雅的退出或者销毁,例如程序在连接mq的时候,肯定是在init初始化函数里面初始化mq的连接信息,在程序退出的时候,需要关闭掉mq的连接。所以这篇文字我们介绍下如何在程序退出或者销毁的时候去做一些操作,实现程序优雅的退出或者销毁。
其实在Go语言里面,实现程序优雅的退出或者销毁的话,我们只需要做一个监听事件即可,当接受到退出或者销毁信号的时候,再去做一些销毁的操作,这里我们做的监听方法是:
import ( "fmt" "os" "os/signal" "syscall" ) func destroy() { // 监控两个信号 // TERM信号(kill + 进程号 触发) // 中断信号(ctrl + c 触发) osc := make(chan os.Signal, 1) signal.Notify(osc, syscall.SIGTERM, syscall.SIGINT) s := <-osc fmt.Println("监听到退出信号,s=", s) // 退出前的清理操作 //clean() fmt.Println("main程序退出") }
然后我们在main方法的最后来执行这个destory方法即可,示例如下:
func main() { fmt.Println("执行main类的main函数") destroy() }
此时我们运行下这个程序,首先我们可以看到初始化的方法和正常的main方法被正确的执行了:
然后我们使用ctrl+c,看下效果:
可以看到立马就接受到了退出的信号,同时执行了这个destroy的方法。
最后附上本案例的源码:
// demo1 project main.go package main import ( "fmt" "os" "os/signal" "syscall" ) func init() { fmt.Println("初始化当前main类") } func destroy() { // 监控两个信号 // TERM信号(kill + 进程号 触发) // 中断信号(ctrl + c 触发) osc := make(chan os.Signal, 1) signal.Notify(osc, syscall.SIGTERM, syscall.SIGINT) s := <-osc fmt.Println("监听到退出信号,s=", s) // 退出前的清理操作 clean() fmt.Println("main程序退出") } func clean() { fmt.Println("程序退出前做的清理工作") } func main() { fmt.Println("执行main类的main函数") destroy() }
备注:
1、这里优雅的退出/销毁主要是依赖信号监听来完成的。
2、这个销毁的方法名不一定使用destroy为名称。
3、这个销毁的方法可以是无参的,也可以是有参的。
4、这个销毁的方法可以被其他函数显示的调用。
还没有评论,来说两句吧...