chan管道的相關(guān)問(wèn)題
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 并未設(shè)置,len屬性,在給returndata 中放值的時(shí)候,是否需要考慮returndata 可以接受的空間?
2、當(dāng)另一個(gè)方法從returndata取值的時(shí)候,是先給returndata中將值全部放入后 range出來(lái),還放一個(gè) range一個(gè)?
2020-03-21
1、channel 是分緩沖通道和非緩沖通道的,在 make channel 的時(shí)候,如果沒(méi)有指定通道容量,那么這就是一個(gè)非緩沖通道。
非緩沖通道的特點(diǎn)是,必須發(fā)送和接收同時(shí)進(jìn)行,否則就會(huì)等待;
而緩沖通道不需要發(fā)送和接收同時(shí)進(jìn)行,但是當(dāng)通道滿的時(shí)候,發(fā)送方也會(huì)阻塞,必須等到接收方從通道中拿走數(shù)據(jù)后才能繼續(xù)發(fā)送。
2、所以上面的代碼沒(méi)有指定容量,是一個(gè)非緩沖通道,那么必然是發(fā)送和接收同時(shí)進(jìn)行的,也可以理解為 放一個(gè) range 一個(gè)。