如何在 Golang 中處理訊號?
在討論**訊號**以及如何處理它們之前,讓我們先談談建立**訊號**的常見場景。**訊號**可以透過終端傳遞,可以透過使用**CTRL+C**終止程式,或者我們可以預設呼叫**os**包提供的**Exit()**函式。
示例 1
讓我們考慮一個示例,其中我們將在一個已延遲的函式宣告之後立即呼叫**os.Exit()**函式。
請考慮以下程式碼。
package main
import (
"fmt"
"os"
"time"
)
func main() {
defer func() {
fmt.Println("Inside the deferred function()")
}()
fmt.Println("Inside the main function")
time.Sleep(1 * time.Second)
os.Exit(1)
}在上面的程式碼中,我們呼叫了**os.Exit()**函式,它將不會給延遲的匿名函式執行的機會,因為程式將退出。
輸出
如果我們使用命令**go run main.go**執行上面的程式碼,那麼我們將在終端中得到以下輸出。
Inside the main function Program exited: status 1.
我們可能會得到的另一個訊號是,我們使用**CTRL+C**終止程序。
如何在 Golang 中處理訊號
我們確實討論了將訊號傳遞到程式的不同方法。現在,讓我們討論一下如何在 Go 中處理這些訊號。
為了優雅地處理這些訊號,我們可以使用一個型別為**os.Signal**的**通道**,它將具有阻塞性質。然後,我們將使用**Notify()**函式,在其中我們可以傳遞我們期望的不同型別的訊號,例如**os.Interrupt**和**syscall.SIGTERM**。
示例 2
請考慮以下程式碼。
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
sigChannel := make(chan os.Signal, 1)
signal.Notify(sigChannel, os.Interrupt, syscall.SIGTERM)
fmt.Println("Try pressing CTRL + C to handle the interrupt")
select {
case <-sigChannel:
fmt.Println("The interrupt got handled")
os.Exit(0)
}
}
在上面的程式碼中,我們建立了一個容量為 1 的緩衝通道,然後我們呼叫了**Notify()**函式。
輸出
如果我們使用命令**go run main.go**執行上面的程式碼,然後按下**CTRL + C**,那麼我們將在終端中得到以下輸出。
Try pressing CTRL + C to handle the interrupt The interrupt got handled
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP