go
黄鸭 3/23/2022 server
# gRPC为什么高效
查看答案
- gRpc 是一个高性能、开源和通用的 RPC 框架
- gRPC的沟通协议是http2
- 二进制分帧,http2数据通信最小单位
- 多路复用,合并多个请求发送,http2支持乱序复用
- 服务器推送,在html渲染之前,服务器就会推送图片文件
- 头部压缩,服务器和浏览器存了表,只发送变更头
- gRPC的沟通内容是protobuf,二进制
- protobuf跨语言,兼容好
- protobuf速度快,体积小
# channel知识点
查看答案
- channel是一种类型,一种引用类型
- channel支持发送,接收,关闭三种操作
- channel是配合协程使用的管道
- channel在关闭后支持for range操作,否则会丢弃数据
- channel在未关闭状态使用select查询状态
- channel支持定义只入和只出
- channel只接收不发送会报错
# go 的map底层原理
查看答案
- 创建阶段
- 首先生成因子
- 2的b次标准桶和2的b-4次溢出桶
- 每个桶有8个值
- 写入阶段
- 计算hash
- 使用低b位,记录到对应桶
- 冲突会放到溢出桶
- 读取阶段
- 计算hash
- 使用高8位找到记录桶
- 找不到去溢出桶找
- 扩容
- map数据/桶个数>6.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的可变长度编码