go之无缓冲channel(通道)和有缓冲channel(通道)
无缓冲channel
无缓冲channel的写入与读取必须同时进行,一个channel被写入必须同时被读取才能顺利进行下一步,实际操作中用定义多个协程来实现读写同步,代码如下:
没有goroutine
package main
import "fmt"
func main(){
ch:=make(chan int)
ch<-1
num:=<-ch/*此时虽然定义了读取channel,但是因为main函数是顺序执行的,所以必须等待上一步ch写入
才能走到这一步,但是ch写入之后必须被读取才能往下一步走,所以这里会造成死锁*/
fmt.Println("读取",num)
}
有goroutine
package main
import "fmt"
func main(){
ch:=make(chan int)
go func(){//此时若定义goroutine则可以顺利读取
ch<-1
}()
num:=<-ch
fmt.Println("读取",num)
}
有缓冲channel
有缓冲channel类似于定义了一个可以存放未被读取的channel的地方,写channel的时候只需把写入的东西放在缓冲中,读取程序也在缓冲中取,不用关心是否同时又取得操作,若把上面会死锁的无缓冲channel代码中的ch定义为有缓冲,则此时不会造成死锁.
package main
import "fmt"
func main(){
ch:=make(chan int,1)//此时定义了一个有缓冲channel
ch<-1
num:=<-ch//从缓冲中拿数据
fmt.Println("读取",num)
}