做照片模板下载网站,python官网,wordpress自带的简码,网站密度一、读取文件数据#xff0c;是阻塞还是非阻塞的#xff1f; 分两种情况#xff1a;常规读取文件数据#xff0c;和网络IO读取数据
1. 常规读取文件数据#xff1a; io.Reader 和 bufio.Reader 是阻塞进行的。 bufio.Reader 提供缓冲的读取操作#xff0c;意味着数据是…一、读取文件数据是阻塞还是非阻塞的 分两种情况常规读取文件数据和网络IO读取数据
1. 常规读取文件数据 io.Reader 和 bufio.Reader 是阻塞进行的。 bufio.Reader 提供缓冲的读取操作意味着数据是被阻塞式地 一次一段地 读取进来然后存储在缓冲区内。当你需要读取更多数据时它会从文件或其他 IO 源继续填充缓冲区。 如果想要异步读取文件可以使用 goroutines 和 channels。
2. 网络IO读取数据
(1) 结论 网络IO在用户层是阻塞进行的(io.Reader)而在底层是以非阻塞的IO多路复用方式(epoll)实现的。 是Go Net 或者 netpoll 把底层系统操作封装起来了最终的效果就是用户层阻塞底层非阻塞。
(2) 解释 每个Goroutine在需要等待网络事件时都会使用netpoll来监听一个或多个文件描述符。 netpoll会在内部以非阻塞的方式轮询注册文件描述符(FDs)一旦有I/O事件发生它就会将对应的事件分发给相应的Goroutine来处理。 netpoll并不是一个单独的函数或者Goroutine而是内嵌在Go的运行时中独立运行的用来处理多个Goroutine注册的I/O事件。 一个Goroutine可以同时监听多个网络连接的事件用户程序不需要为每个连接单独创建一个Goroutine。
(3) 引申 因为Go 具备了在 用户层用 阻塞io 进行读写的逻辑所以 Go 推崇使用阻塞式的方式来编写程序当需要处理并发逻辑时就通过goroutine和channel来实现。 二、GO使用组合而非继承体现了哪些优势
1. 代码更优雅对象的层次结构能够保持简洁易于理解对象是负责哪个单一任务。
2. 降低了耦合继承表示的是类型扩展的逻辑而组合表示的是对象之间的包含关系。组合模式需要承担的职责更低比如省去了构造和析构的继承逻辑。
3. 使用更灵活嵌入的对象可以在运行的时候被改变被替换成同类型对象。 三、传参、引用类型、赋值 Go语言传参不管是数值类型还是引用类型都是 值传递。 传递 引用类型 的时候传递的是指针。传递之后会有新的指针变量但是指向的数据是同一份数据 修改数据的话会修改原值。 引用类型 赋值 的话是浅拷贝数据修改逻辑同上。