Skip to content

20210403关于管道的哪里创建哪里关闭原则(1)

zqy edited this page Apr 3, 2021 · 1 revision

你看,现在的情况是:
已经可以硬性的去规定:
任何river-node内部的,只要是Raws都禁止在其内部make,只要是News则必须存在创建逻辑 make一个Raws的操作应由使用它的river负责


回到正题,你还是需要明白那几个最基本的“名词”:
首先,声明与定义是一回事,定义既是声明,而他的具体形式是:(拿函数举例更为直观)

func 函数名(形式参数列表)(返回值列表){
    函数体
}

因此这两个名词与现在要探讨的并没有关系
尤其是new和make并没有关系
继续探讨new与make,他们都是被称作初始化,不同点是,new只返回一个对应类型的指针具体区别如下:

1、make只能用来分配及初始化类型为slice,map,chan的数据;new可以分配任意类型的数据
2、new分配返回的是指针,即类型*T;make返回引用,即T;
3、new分配的空间被清零,make分配后,会进行初始化

可以简单理解成make相当于实现了var i int 的隐式初始化并赋予了一个默认值“0”,而new则只进行初始化,并没有赋予这个默认值0
这里我没要重点记住,这个操作被称为初始化

这篇文章探讨的核心是“哪里初始化,哪里close”

因此,river-node虽然“存在”着各个Raws,但是严禁进行对各个Raws的“初始化”操作
然后我们对比看一下golang的结构体与c++的类:

type goStruct struct{
    a int
    b int
}

class cjiajiaClasss{
    private:
    //int a =0; c++同样禁止这样的初始化
    //int b =0; c++同样禁止这样的初始化
    int a; //这里仅仅是定义(声明)
    int b; //这里仅仅是定义(声明)
}

还是要先明确一点,定义与声明无论是在哪种语言里都是一气呵成的
上面所提到的函数的定义方式,这里则正是变量的定义方式
再细致的梳理一下先后顺序:

定义(声明)->开辟内存->初始化(赋默认值)
而make的意义是“开辟内存->初始化(赋默认值)”,new则是只“只开辟内存”

接下来用反向思维继续探讨问题:
close内置方法只负责关闭管道,并不负责对管道所处的内存片段进行销毁工作,销毁工作还是gc进行的,当管道所在的所有声明所有作用域的声明周期都结束后,就会被自动回收
因此可以确切的得出结论:
哪里初始化,哪里销毁
而无论是在一个结构类内部所书写的ch chan []byte还是在外部作用域所书写的ch chan []byte则都是只是进行了定义/声明,这就像是c++一个类的内部先要在.h文件里定义/声明一个函数,再去对应的.cpp内部实现这个函数那样

虽然还有没细致思考的只是点,但是先思考到这里吧

Clone this wiki locally