golang 中 channel 的非阻塞訪問方法
在golang中,基本的channel讀寫操作都是阻塞的,如果你想要非阻塞的,可以使用如下示例:
即只要在select中加入default,阻塞立即變成非阻塞:
package main import "fmt" func main() { messages := make(chan string) signals := make(chan bool) select { case msg := <-messages: fmt.Println("received message", msg) default: fmt.Println("no message received") } msg := "hi" select { case messages <- msg: fmt.Println("sent message", msg) default: fmt.Println("no message sent") } select { case msg := <-messages: fmt.Println("received message", msg) case sig := <-signals: fmt.Println("received signal", sig) default: fmt.Println("no activity") } }
注意,golang無法kill 一個 goroutine,你 #只能# 通過一個channel給它傳送訊息讓它退出,示例如下:
quit := make(chan bool) go func() { for { select { case <- quit: return default: // Do other stuff } } }() // Do stuff // Quit goroutine close(quit)