在软件开发过程当中,咱们经常作的一件事,就是编写公用库,或是基础库。这个过程能够称之为 应用级抽象。应用级抽象的好处在于,接口主要面向应用,因此在适配度远远超过功能性接口。
以信号管控为例,在 Go 语言中管控进程信号,很是简单。只须要简单的 3 行代码便可完成管控:git
package main import "os/signal" func main() { //信号接收 channel sigCh := make(chan os.Signal, 1) //监听信号(全部信号) signal.Notify(sigCh) //信号触发 sig := <-sigch //TODO }
但在实际开发过程当中,这些功能性的函数缺乏了应用级抽象,想要像搭积木同样构建应用程序多少有些不便。因此,花了点时间作一下应用级别抽象,方便之后使用。github
既然是应用级抽象,就从应用层面入手,首先给这块抽象的积木,按照功能命个名,就叫Capture
好了。网络
//信号捕获器 type Capture struct{ //TODO }
既然是信号捕获, 在建立Capture
时须要定义具体信号的触发操做,将具体<信号,触发函数>
,取个英文名Trap
。那么,在建立Capture
时,就能够作为参数传进去。同时,Capture
必须处于服务状态,才能够监听并触发信号操做,因此须要提供一个Capture.Serve
函数。最终但愿的应用级接口就是这样:框架
package main import ( "context" "log" "syscall" "github.com/x-mod/sigtrap" ) func main() { ctx, cancel := context.WithCancel(context.Background()) capture := sigtrap.New( sigtrap.Trap(syscall.SIGINT, sigtrap.Handler(cancel)), sigtrap.Trap(syscall.SIGTERM, sigtrap.Handler(cancel)), ) defer capture.Close() log.Println("sigtrap: waiting ...") log.Println("sigtrap:", capture.Serve(ctx)) }
具体的Capture
实现也很是的简单,能够直接参考项目源码: github.com/x-mod/sigtrap.不少相似这样简单工具包均没有太多的技术难度,封装主要目的就是在作应用级抽象。tcp
这个包主要用在个人另一个应用级抽象包:x-mod/routine中。它主要抽象的是,main
函数与go routine
协程控制,具体实现功能之后抽时间分享,感兴趣的话能够参考项目源码。函数
更多应用级抽象工具包目录在这个仓库:github.com/x-mod/index.工具