直接使用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() } } }
完整代碼:spa
package main import ( "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) } } }