当前位置: 首页 > news >正文

Go语言 一些问题了解

一、读取文件数据,是阻塞还是非阻塞的?

        分两种情况:常规读取文件数据,和网络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语言传参,不管是数值类型还是引用类型,都是 值传递

    传递 引用类型 的时候,传递的是指针。传递之后,会有新的指针变量,但是指向的数据是同一份数据, 修改数据的话会修改原值

    引用类型 赋值 的话是浅拷贝,数据修改逻辑同上。

http://www.lryc.cn/news/362102.html

相关文章:

  • C++ Primer 第五版 第15章 面向对象程序设计
  • finebi或者finereport发邮件
  • 基于聚类和回归分析方法探究蓝莓产量影响因素与预测模型研究
  • 【数据结构】从前序与中序遍历,或中序与后序遍历序列,构造二叉树
  • ARM公司发展历程
  • C# :IQueryable IEnumerable
  • 三、生成RPM包
  • 单实例11.2.0.4迁移到11.2.0.4RAC_使用rman异机恢复
  • MySQL之查询性能优化(二)
  • The Best Toolkit 最好用的工具集
  • 使用C#反射中的MAKEGENERICTYPE函数,来为泛型方法和泛型类指定(泛型的)类型
  • sql注入 (运用sqlmap解题)
  • HTML5 Canvas 绘图教程二
  • Linux 命令 find 的深度解析与使用
  • 字符串操作记录
  • 【python科学文献计量】关于中国知网检索策略的验证,以事故伤害严重程度检索为例
  • AdminController
  • Vue3-Pinia状态管理器
  • 安装存储器的段描述符并加载GDTR
  • 2024年5月架构试题
  • 品牌控价的同时也要做好数据分析
  • 微服务学习Day11-缓存问题学习
  • 虚拟化知识学习
  • 一键生成迷宫-Word插件-大珩助手新功能
  • 运维开发详解(上)
  • react useState基本使用
  • 基于jeecgboot-vue3的Flowable流程-待办任务(二)
  • 1103. 分糖果 II
  • SQL实验 数据的插入、修改和删除操作
  • es初始化