go

3/23/2022 server

# gRPC为什么高效

查看答案
  1. gRpc 是一个高性能、开源和通用的 RPC 框架
  2. gRPC的沟通协议是http2
    • 二进制分帧,http2数据通信最小单位
    • 多路复用,合并多个请求发送,http2支持乱序复用
    • 服务器推送,在html渲染之前,服务器就会推送图片文件
    • 头部压缩,服务器和浏览器存了表,只发送变更头
  3. gRPC的沟通内容是protobuf,二进制
    • protobuf跨语言,兼容好
    • protobuf速度快,体积小

# channel知识点

查看答案
  • channel是一种类型,一种引用类型
  • channel支持发送,接收,关闭三种操作
  • channel是配合协程使用的管道
  • channel在关闭后支持for range操作,否则会丢弃数据
  • channel在未关闭状态使用select查询状态
  • channel支持定义只入和只出
  • channel只接收不发送会报错

# go 的map底层原理

查看答案
  1. 创建阶段
    • 首先生成因子
    • 2的b次标准桶和2的b-4次溢出桶
    • 每个桶有8个值
  2. 写入阶段
    • 计算hash
    • 使用低b位,记录到对应桶
    • 冲突会放到溢出桶
  3. 读取阶段
    • 计算hash
    • 使用高8位找到记录桶
    • 找不到去溢出桶找
  4. 扩容
    • map数据/桶个数>6.5,会翻倍扩容
    • 溢出桶太多会触发等量扩容
  5. 迁移
    • 分流时依然按照低b位,但是b会增加1所以会二次分流
    • 等量扩容相当于把溢出桶的数据迁移到普通桶

# go 中用 for 遍历多次执行 goroutine会存在什么问题?怎么改进?

查看答案
  • for中函数使用全局变量可能会出现指向最后一个变量
  • 所以应该把执行的变量作为参数传入goroutine

# 如果要在每个goroutine中都获取返回值(捕获参数),有哪些方案?

查看答案
  • 使用全局变量和锁同步
  • Channel 管道进行数据同步
  • waitgroup,标记执行情况,可以在主线程使用

# new和make有什么区别?

查看答案
  • new返回指针make返回变量
  • make只能分配slice,map,channel,new可以分配任何数据
  • new 会为简单变量分配空间,复杂变量只会声明指针
  • make会为复杂变量初始化方法

# gmp

查看答案
  • g是任务,保存执行指令和参数
  • m是系统物理线程
  • p是逻辑处理器,负责调度逻辑处理器和任务

# gmp当一个g堵塞时,g、m、p会发生什么

查看答案
  • 系统调度引起阻塞,m会和p发生解绑,p会绑定空闲或新的m来保证g的处理
  • 由于系统io或网络io阻塞时,g会被放入等待队列,当g被标记为可运行状态时,重新加入队列

# 有缓存和无缓存channel的区别

查看答案
  • 无缓冲创建是make(chan TYPE) 数据接收前发送阻塞,数据发送前接收阻塞,要同时
  • 有缓冲创建是make(chan TYPE,SIZE) 缓冲满时发送阻塞,缓冲空时接收阻塞,对应满和空

# byte和rune有什么区别

查看答案
byte是uint8的别名可以标识ASCII码,字母数字符号
rune是int32的别名可以表示Unicode码,utf8是基于unicode的可变长度编码
更新时间: 2022-03-30 12:42