20210214!!!3个“通信”不可能变成4个“通信”!!! - ziyouzy/2021blog GitHub Wiki

3个“通信”不可能变成4个“通信”,因为这种情况一定是可以拆分成两个独立的事件的 而这些都不重要,重要的是,数据流动的目的之一是,让一块内存里的数据只会被创建和销毁,而不会被修改 先看个最简单的例子:

func (p *CRC)readOnlyCheck(mb []byte){
raw,crc := p.midModbus(mb) 

if bytes.Equal(p.checkCRC16(raw, p.config.IsBigEndian), crc){
	p.config.SignalChan <- define.CRC_NORMAL
}else if bytes.Equal(p.checkCRC16(raw, !p.config.IsBigEndian),crc){
	p.config.SignalChan <- define.CRC_UPSIDEDOWN
}else{
	p.config.SignalChan <- define.CRC_NOTPASS
}

}

raw,crc都会缓存,需要在循环内部被用各种方式创建出来(之后遇到复杂的情况,如两个管道发来的数据合成一个缓存,而不是像这个,一个管道发来的数据合成两个缓存
合成的功能函数会在for range结构体之外,new类型会作为返回值,然后再for range {}内部调用,如new := p.func(a,b) newc
而无论是raw,crc,还是newc的本质则是一个被创建新的数据,或者说,各个adapter(following、流动的过程)的作用都是在于创建某个或某些新数据
而signal所代表的意义其实是创建新数据的“结果”

分工思路也变得更加清晰了: 各个adapter(following,creator)的目的是创建新数据,而具体流程则是:
1.从一个或多个管道接收事件(数据) 2.创建新数据 3.将数据放入属于下游的某个管道

确实会存在一个adapter内包含多个上游管道和多个下游管道的情况,但是一个“新数据”一定会对应一个“下游管道”
这是需要绝对严格遵循的一对一关系 同时对于数据的接收,本质只是指针的传递,这不是存粹的创建,因为上游的某个适配器才会包含“这个引用所指向内存的本体”
而所谓的创建,如raw,crc := p.midModbus(mb) 则是同时创建了内存的本体和指向他的引用

再比如对每一次从net.Conn读到数据,每次都属于是创建的事件于是,每个客户链接必须有和他1、1对一个的一个管道

总之大致就是这个意思,没法解释的完全明白

起始buf :=net.conn.read()和raw,crc := p.midModbus(mb) 以及后期会遇到的用来储存合成数据的buffur是地位平等的东西 有他们就一定会有新管道配套出现
同时任何要给adapter都会有for循环结构,结构内部一定会有与这三者地位一致的结构

而对于调用所有adapter的外层,其始本质是在做各个adapter之间的数据传输

似乎可以这么认为,adapter的作用是在创建数据并放入通信管道,共享内存仅仅是在创建数据这个步骤会用到
而调用adapter的上层则是在用这些创建好的内部有数据的通信管道实现跨线程共享数据

在说的哲学一点,adapter的作用其实是创建新数据并将数据“量子化”(打破线程屏障)
调用adapter的上层则是将这些量子化的数据进行adapter与adapter之间的传递
而共享数据只是为了创建新数据所需要用到的工具
同时,数据流动这一名词,或者说设计模式,用某种方式打破线程屏障是其必须具备的属性,否则就不能说他是纯粹数据流动设计模式