1. 程式人生 > >go語言channel關注點

go語言channel關注點

package main

import (
       "fmt"
)

func main() {

       //case 1: 對一個nil channel 進行寫將發生阻塞.
       //var c chan  int //go語言自動對未初始化的變數賦其型別對應的零值,如: nil, 0, ""等.
       //c <- 1
       //case 2: 對一個nil channel 進行讀將發生阻塞.
       //<- c
       //case 3: 對一個已經關閉的unbuffered channel進行寫操作,將發生panic異常.
       //c1 := make(chan int)
//close(c1) //c1 <- 1 //case 4: 對一個已經關閉的unbuffered channel進行讀操作,返回channel元素型別的零值,如:false,o,nil等 //x := <- c1 //fmt.Println(x) //case 5: 對一個已經關閉的buffered channel進行讀操作,見以下程式碼註釋. c2 := make(chan int, 3) c2 <- 1 c2 <- 2 c2 <- 3 close(c2) //儘管channel 已經關閉了, 但是我們依然可以從中讀出關閉前寫入的3個值,自第4次開始讀取時,則返回該channel元素型別對應的零值: 0,
//即使仍繼續不斷讀取,仍然是零值. fmt.Printf("%d\n", <- c2) fmt.Printf("%d\n", <- c2) fmt.Printf("%d\n", <- c2) fmt.Printf("%d\n", <- c2) fmt.Printf("%d\n", <- c2) fmt.Printf("%d\n", <- c2) //case 6: 對一個已經關閉的buffered channel進行寫操作,將發生panic異常. c2 <- 4
//大原則: 1. 最好由生產者或稱寫入者負責關閉channel,這樣可以有效避免發生panic異常. //2. 不帶緩衝的channel本身具有通訊同步兩個特點,channel是執行緒安全的,協程安全的,可多個goroutine共享使用不必加鎖保護它. }
參考: http://tonybai.com/2014/09/29/a-channel-compendium-for-golang/ 
簡單整理細化一下,寫程式碼測試了一下,怕忘了寫下筆記,感謝參考文章作者,讀其文章令我受益匪淺,在此表達感謝。
注意: 此文章只是我個人筆記, 如有錯漏,請一定指正, 共同學習, 我的郵箱: [email protected]