我們常常使用channel來在多個goroutine之間做數據通訊,但是chan作為函數的入參我們應當怎樣寫呢?或許有人覺得這個問題比較傻,不過這個還真的是我今天才知道的.
首先我們看看下面的代碼:
func main() {
c := make(chan int)
go in(c)
go out(c)
time.Sleep(time.Second)
}
func in(c chan int) {
for i := 0; i < 10; i++ {
c <- i
}
close(c)
fmt.Println("int end")
}
func out(c chan int) {
for i := range c {
fmt.Printf("%d
", i)
}
fmt.Println("out end")
}
這個不過就是在in方法里面給channel插入10個數字,然后在out方法里面把這是個數字順次取出來(是的你沒看錯,range可以用于從channel中取值).
如果我想把out方法交給第3方去實現,但是我又需要輸出的的數字順序嚴格依照我的順序來,也就是說我需要顯式的規定out方法只能從channel中取值,不能給channel中賦值,這個時候我們應當依照下面的方式去寫
type channelFunces interface{
Out(c <-chan int)
}
1旦在實現這個out方法的時候向chan里面插入值的話,就會連編譯都不過(感嘆go男的嚴謹,大神的設計就是經典),從而我們可以通過方法的入參來限制通道的數據進出方向,那末如果想限制chan只能插入不能讀出應當怎樣寫呢?
type channelFunces interface{
Out(c <-chan int)
In(c chan<- int)
}
基于這類寫法我們可以在設計進程中來避免chan暴露出去數據的進出權限沒法控制,固然你在參數上面不寫”<-“的話,這個通道就是1個全雙工的通道了,具體根據你需要編寫的業務來定,不過能限制的話盡可能限制住,養成良好的編碼習慣,應當從這些細節開始.