在軟件開發過程當中,咱們經常作的一件事,就是編寫公用庫,或是基礎庫。這個過程能夠稱之爲 應用級抽象。應用級抽象的好處在於,接口主要面向應用,因此在適配度遠遠超過功能性接口。
以信號管控爲例,在 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.工具