nil channel

nil_channel

  • go中,可以對nil值channel進行讀寫操作,但會永遠阻塞,而為nil值的channel调用close()會panic

  • `註:這邊不像nil map一樣塞值就會引發panic

例子1:往nil_channel送值

  • 當channel只有宣告,但沒有經過make,預設值是nil

func main() {
	var stringChan chan string
	fmt.Println(stringChan)
	stringChan <- "hello world"
	time.Sleep(time.Minute) //模擬用 讓程式暫緩退出
}

結果: 因為送不進去就會塞住bloak,等不到有其他goroutines取走資料 出現fatal error: all goroutines are asleep - deadlock!

例子2:非同步往nil_channel送值

func main() {
	var stringChan chan string
	// stringChan := make(chan string)
	go func() {
		stringChan <- "hello world"
        fmt.Println("inpt channal")
	}()
	

	time.Sleep(time.Minute) //模擬用 讓程式暫緩退出
}
  • 結果: 什麼事都沒發現,但也塞不進去,形成阻塞,當前goroutines在阻塞等待

例子三:非同步往nil_channel送值,並從nil讀取

func main() {
	var stringChan chan string
	// stringChan := make(chan string)
	go func() {
		stringChan <- "hello world"
	}()
	fmt.Println(<-stringChan)

	time.Sleep(time.Minute) //模擬用 讓程式暫緩退出
}

// <!-- go run main.go
// fatal error: all goroutines are asleep - deadlock!

// goroutine 1 [chan receive (nil chan)]:
// main.main()
//         D:/go/src/demo-go/12-go-channel/main.go:15 +0x4e

// goroutine 6 [chan send (nil chan)]:
// main.main.func1()
//         D:/go/src/demo-go/12-go-channel/main.go:12 +0x25
// created by main.main
//         D:/go/src/demo-go/12-go-channel/main.go:11 +0x45
// exit status 2 -->
  • 結果 引發fatal error: all goroutines are asleep - deadlock!

參考文章

Last updated