如何在 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

更新於:2021年11月1日

1K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.