Go 语言笔试面试题汇总 Go 语言笔试面试题(基础语法) Golang:内存分配和垃圾回收 文章目录 一.showmebug面试题 为什么协程比线程轻量? 协程阻塞 四、性能优化 go go server 4. 项目 gin框架 Gin 路由解析 每个线程/协程占用多少内存知道吗? 如果若干线程中一个线程OOM,会发生什么?如果是Goroutine 呢? 项目 中出现过OOM吗? 追踪bug 错误处理 如果若干Goroutine有一个panic,会发生干什么? 一个defer能捕获到一个Goroutine下 子Goroutine下的panic吗? gRPC gateway proto 文件怎么管理 服务发现是怎么做的 注册中心挂了怎么办 gin 怎么做参数校验 中间件 go 解析tag用的什么, 反射的原理 反射:通过字符串来调用函数 golang锁 channel有用过吗,哪些需要注意的地方? 四、数据库篇 数据库锁 负载均衡算法 锁 mutex的模式 egg-tech 参数函数 go 切片扩容 新浪面试 TCP和UDP的区别 tcp丢包问题 四.图**视 4.1 1面技术面(问技术实现,底层偏多) 1.mysql 相关 回表 多个单列索引和联合索引的区别 数据库其他知识点: 事务 悲观锁 乐观锁 乐观锁的缺点 项目为什么使用MQ(应用场景) 4.2 技术面2面(问技术实现较多) 4.3 面技术面(主要对简历) 3.aes加密 PostgreSQL 与 MySQL比较: 5. blowfire 5.1 技术1面 项目负责人leader 5.2 2面 、技术负责人 排序算法 求最n位数组的 最大子数组的最大和 六. flow 3. go语言关于值类型和引用类型 4.Go语言参数传递是传值还是传引用 4.1 什么是传值(值传递, map, chan) 4.2 什么是传引用(引用传递) 4.3 特殊的slice random waitgroup 如何控制并发 一.showmebug面试题 为什么协程比线程轻量? go协程调用跟切换比线程效率高 进程 系统进行资源分配的基本单位,有独立的内存空间 线程 cpu调度和分派的基本单位,线程依赖进程,共享父进程的 资源 协程 是用户态 的 轻量级线程,协程的调度完全由用户控制 。协程 间切换只需要保存上下文,没有内核的开销 (线程并发执行流程: ??线程是内核对外提供的服务,应用程序可以通过系统调用让内核启动线程,由内核来负责线程调度和切换。线程在等待IO操作时线程变为unrunnable状态会触发上下文切换。现代操作系统一般都采用抢占式调度,上下文切换一般发生在 时钟中断和系统调用返回前,调度器计算当前线程的时间片,如果需要切换就从运行队列中选出一个目标线程,保存当前线程的环境,并且恢复目标线程的运行环境,最典型的就是切换ESP指向目标线程内核堆栈,将EIP指向目标线程上次被调度出时的指令地址。) ==go协程并发执行流程:不依赖操作系统和其提供的线程,golang自己实现的CSP并发模型实现:M, P, G ??go协程也叫用户态线程,协程之间的切换发生在用户态。协程 间切换只需要保存上下文。 在用户态没有时钟中断,系统调用等机制,因此效率高== 协程非常轻量 执行go协程只需要极少的栈内存(大概是4~5KB),默认情况下,线程栈的大小为1MB。 上下文切换代价小 上下文且含涉及到3个寄存器,线程切换涉及到15个寄存器 GPM G保存运行堆栈,执行函数。可重用。goroutine就是一段代码,一个函数入口,以及在堆上为其分配的一个堆栈。所以它非常廉价,我们可以很轻松的创建上万个goroutine,但它们并不是被操作系统所调度执行。 协程阻塞 1 原子 互斥量 和通道操作导致的 阻塞,会被切出去,然后会去执行 LRQ的其他G 2 网络请求和io导致的 阻塞。会被切到网络轮训器等待异步结果。P处理其他的G。异步结果拿到后,重新加入P。不需要 额外的M 3 系统函数操作导致的阻塞,比如文件io,P会切换到新的M去执行剩余的任务,阻塞的系统调用完成后,G重新加入P 4 后台 执行sleep导致的阻塞。golong后台监视线程sysmon,会把它标记为可以强占,LRQ优先执行。等到这个G继续执行的时候,就会被强占,同时保护现场,重新加入P的队列等待下次执行 通过GPM实现少量线程支持大量的并发,并通过网络轮训器 和sysmon来减少线程的阻塞。充分利用 有限的线程资源 ,提高go的运行效率 /u011957758/article/details四、性能优化 性能查看工具 pprof,trace 及压测工具 wrk 或其他压测工具的使用要比较了解。 代码逻辑层面的走读非常重要