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)
}
posted @ 2020-06-09 12:12  la_vie  阅读(147)  评论(0)    收藏  举报