一、读取文件数据,是阻塞还是非阻塞的?
分两种情况:常规读取文件数据,和网络IO读取数据
1. 常规读取文件数据:
io.Reader 和 bufio.Reader 是同步进行的。
bufio.Reader
提供缓冲的读取操作,意味着数据是被阻塞式地 一次一段地 读取进来,然后存储在缓冲区内。当你需要读取更多数据时,它会从文件或其他 IO 源继续填充缓冲区。
如果想要异步读取文件,可以使用 goroutines 和 channels。
2. 网络IO读取数据:
Go语言中的网络IO模型,主要采用IO多路复用的方式,通过 goroutine 和 阻塞机制, 同时监听多个IO事件(文件描述符fd)。
开发者使用阻塞式的方式来编写程序,然后通过goroutine和channel来处理并发,每个channel对应一个io操作。所有的IO操作都是阻塞调用的。
Go语言中,网络IO的操作被封装在netpoll中。。
二、GO使用组合而非继承,体现了哪些优势?
1. 代码更优雅:对象的层次结构能够保持简洁,易于理解对象是负责哪个单一任务。
2. 降低了耦合:继承表示的是类型扩展的逻辑;而组合表示的是对象之间的包含关系。组合模式需要承担的职责更低,比如省去了构造和析构的继承逻辑。
3. 使用更灵活:嵌入的对象,可以在运行的时候被改变,被替换成同类型对象。
三、传参、引用类型、赋值
Go语言传参,不管是数值类型还是引用类型,都是 值传递。
传递 引用类型 的时候,传递的是指针。传递之后,会有新的指针变量,但是指向的数据是同一份数据, 修改数据的话会修改原值。
引用类型 赋值 的话是浅拷贝,数据修改逻辑同上。