chan管道的相關問題
func?InMemSort(a?chan?int)?chan?int?{ ???returnData?:=?make(chan?int) ???sli?:=?[]int{} ???go?func()?{ ??????for?v?:=?range?a?{ ?????????sli?=?append(sli,?v) ??????} ??????sort.Ints(sli) ??????for?_,?val?:=?range?sli?{ ?????????returnData?<-?val ??????} ??????close(returnData) ???}() ???return?returnData }
1、這塊中的returndata chan 并未設置,len屬性,在給returndata 中放值的時候,是否需要考慮returndata 可以接受的空間?
2、當另一個方法從returndata取值的時候,是先給returndata中將值全部放入后 range出來,還放一個 range一個?
2020-03-21
1、channel 是分緩沖通道和非緩沖通道的,在 make channel 的時候,如果沒有指定通道容量,那么這就是一個非緩沖通道。
非緩沖通道的特點是,必須發送和接收同時進行,否則就會等待;
而緩沖通道不需要發送和接收同時進行,但是當通道滿的時候,發送方也會阻塞,必須等到接收方從通道中拿走數據后才能繼續發送。
2、所以上面的代碼沒有指定容量,是一個非緩沖通道,那么必然是發送和接收同時進行的,也可以理解為 放一個 range 一個。