本文主要总结了在学习channel的时候一些用法的汇总
channel的定义:make(chan string):
ch:= make(chan string)
channel同步,数据传递:
写端: ch<- “hello” ---- 写端写数据,读端不在读,阻塞
读端 : buf := <-ch ---- 读端读数据,同时写端不再写,读端阻塞
len(ch) : channel中剩余未读取数据个数。cap(ch) :通道的容量
无缓冲channel :
通道容量为0,len=0.
channel 应用于两个go程中。一个读,另一个写
具备同步能力。读、写同步
有缓冲的channel: (此时就不是同步操作了,而变成异步操作了)
通道容量为非0。 len(ch) : channel中剩余未读取数据个数。cap(ch):通道的容量。
channel 应用于两个go程中。一个读,另一个写。
缓冲区可以进行数据存储。存储至容量上限-》阻塞。具备异步能力,不需同时操作channel缓冲区(发短信)
关闭channel :
确定不再向对端发送、接受数据时,可使用close(ch) 来关闭channel
对端可以判断channel是否关闭
if num,ok := <- ch;ok ==true{
//如果对端已经关闭,ok-->false
//如果对端没有关闭,ok-->true
}
也可以使用range 替代ok :for num:= range ch{ //ch不能替换为<-ch ; fmt.Println("读到数据:",num) }
总结:1.数据未发完,不应该关闭 。2.已经关闭的channel,不可以再往内写入数据。3.channel关闭后依然可以读,但是读到的是0 — 说明写端关闭
下面给出一个案例
package main
import (
"fmt"
"time"
)
func main(){