-
Notifications
You must be signed in to change notification settings - Fork 0
20210226再来说说什么是管道的创建
zqy edited this page Feb 26, 2021
·
2 revisions
先看下面真实存在的示例:
type StampsConfig struct{
UniqueId string /*其所属上层Conn的唯一识别标识*/
Signals chan river_node.Signal /*发送给主进程的信号队列,就像Qt的信号与槽*/
Errors chan error
/** 分为三种,HEAD、TAIL、HEADANDTAIL
* 当是HEADANDTAIL模式,切len(stamp)>1时
* 按照如下顺序拼接:
* stamp1+raw(首部);raw+stamp2(尾部);stamp3+raw(首部);raw+stamp4(尾部);stamp5+raw(首部);....
* 这样的首尾交替规律的拼接方式
*/
Mode int
Breaking []byte /*戳与数据间的分隔符,可以为nil*/
Stamps [][]byte /*允许输入多个,会按顺序依次拼接*/
Raws chan []byte /*从主线程发来的信号队列,就像Qt的信号与槽*/
News chan []byte /*校验通过切去掉校验码的新切片*/
}
真实存在着两个管道,一个是Raws,一个是News,在这里并没有完成完整的“创建”操作
而在上层往往会进行诸如:
stampsRaws :=make(chan []byte)
这样的操作,之后在进行配置时会进行
testStampsConfig StampsConfig{
Raw: stampsRaws,
}
这样的操作
于是问题来了,这是属于创建管道还是连接管道呢?
再看一个connect函数:
TestDataCreaterNews := make(chan []byte)
HBRaws := make(chan struct{})
CRCRaws := make(chan []byte)
func TestDataCreaterConnectCRC(){
go func(){
for bytes := range TestDataCreaterNews{
fmt.Println("source bytes is", bytes)
HBRaws <- struct{}{}
CRCRaws <- bytes
}
}()
}
似乎创建管道往往会伴随着连接的操作,同时,HBRaws也根本没有进行任何连接的操作
是不是说,连接管道的方式分为:
- 面向数据连接
- 面向管道指针连接?
我所思考的问题是,各类操作所扮演的不同角色是什么,如:
go func(){for range {}}()结构是管道间的连接
而这里所探讨的{Raws: xxxRaws,}呢,似乎是准备对数据流某种形式的“加工”....
想明白了{Raws: xxxRaws,}的本质其实是“函数参数表的传参”操作,其实connect也有同样的环节只不过是被省略了
至此一切的逻辑再一次都对上了