直接使用go 函式名()可以開啟一個grountine,channel可以接收資訊并且如果沒有資料時會阻塞住
channel對應的是底層資料結構的參考,復制channel和函式傳參都是拷貝的參考
make的時候第二個引數是1,就表示是有快取的channel
無快取的channel也叫同步channel
c = make(chan interface{}) //開啟groutine go mySig() //主grountine不能斷 for { time.Sleep(time.Second) c <- "taoshihan" }func mySig() { for { str := <-c fmt.Println(str) }}
信號處理使用channel通信
func catchSignal() { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) for { s := <-c logger.Info("收到信號 -- ", s) switch s { case syscall.SIGHUP: logger.Info("收到終端斷開信號, 忽略") case syscall.SIGINT, syscall.SIGTERM: shutdown() } }}
完整代碼:
package mainimport ( "fmt" "os" "os/signal" "syscall" "time")var c chan interface{}func main() { go catchSignal() c = make(chan interface{}) //開啟groutine go mySig() //主grountine不能斷 for { time.Sleep(time.Second) c <- "taoshihan" }}func mySig() { for { str := <-c fmt.Println(str) }}func catchSignal() { d := make(chan os.Signal, 1) signal.Notify(d, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) for { s := <-d fmt.Println("收到信號 -- ", s) switch s { case syscall.SIGHUP: fmt.Println("收到終端斷開信號, 忽略") case syscall.SIGINT, syscall.SIGTERM: //這里可以做一些退出動作 fmt.Println("關閉") os.Exit(0) } }}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/63344.html
標籤:Go
