Skip to content

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也根本没有进行任何连接的操作

是不是说,连接管道的方式分为:

  1. 面向数据连接
  2. 面向管道指针连接? 我所思考的问题是,各类操作所扮演的不同角色是什么,如:
    go func(){for range {}}()结构是管道间的连接
    而这里所探讨的{Raws: xxxRaws,}呢,似乎是准备对数据流某种形式的“加工”....
    想明白了{Raws: xxxRaws,}的本质其实是“函数参数表的传参”操作,其实connect也有同样的环节只不过是被省略了
    至此一切的逻辑再一次都对上了
Clone this wiki locally