Go 面试八股

50 节教程 · 点击章节开始阅读

01Go 中值类型与引用类型有什么区别?开始阅读 ›02string 为什么不可变?string 与 []byte 相互转换的代价是什么?开始阅读 ›03零值是什么?nil 有哪些常见陷阱(nil slice、nil map)?开始阅读 ›04slice 的底层结构是什么?它的扩容机制是怎样的?开始阅读 ›05map 的底层结构是什么?扩容(rehash)是怎么进行的?开始阅读 ›06什么是方法集?值接收者与指针接收者有哪些差异?开始阅读 ›07接口的底层结构(eface/iface)是怎样的?类型断言如何使用?开始阅读 ›08error 与 panic 各自适合什么场景?开始阅读 ›09defer 的执行顺序是怎样的?它的参数何时求值?开始阅读 ›10recover 有哪些限制?为什么它只能“救”当前 goroutine?开始阅读 ›11goroutine 与操作系统线程有什么区别?开始阅读 ›12★ Go 的 GMP 调度模型是怎样的?开始阅读 ›13★ channel 的底层结构是怎样的?收发的基本流程如何?开始阅读 ›14★ channel 关闭之后收发会怎样?range 与单向 channel 有哪些注意点?开始阅读 ›15select 的随机选择是怎么实现的?default 分支有什么用?开始阅读 ›16★ sync.Mutex 与 sync.RWMutex 的原理与用法要点是什么?开始阅读 ›17sync/atomic 与 CAS 是什么?何时用它而不是加锁?开始阅读 ›18sync.WaitGroup 怎么用?有哪些常见坑?开始阅读 ›19★ 什么是数据竞争?如何检测和避免并发竞态?开始阅读 ›20sync.Map 适合什么场景?它的底层原理是怎样的?开始阅读 ›21★ context 的树形结构、取消与超时是如何工作的?传值有什么纪律?开始阅读 ›22什么是栈与堆?Go 的逃逸分析是怎么工作的?开始阅读 ›23★ Go GC 的三色标记与写屏障是什么?开始阅读 ›24★ GC 的触发时机是什么?GOGC 与 GOMEMLIMIT 怎么调优?开始阅读 ›25goroutine 泄漏的典型场景有哪些?如何定位与预防?开始阅读 ›26★ Go 内存模型:happens-before 是什么,同步原语保证了什么?开始阅读 ›27内存可见性:什么情况下必须同步,什么时候不需要?开始阅读 ›28★ 数据竞争检测器 race 怎么用?原理是什么?开始阅读 ›29★ pprof 采样工具链怎么用?CPU/内存/goroutine 问题分别怎么排查?开始阅读 ›30常见性能优化切入点有哪些(字符串拼接/内存分配/对象复用)?开始阅读 ›31★ reflect 的基本用法是什么?性能代价有多大?开始阅读 ›32unsafe.Pointer 有什么用途?风险在哪里?开始阅读 ›33Go 泛型的约束与类型集合怎么理解?和接口怎么取舍?开始阅读 ›34★ make、new 与零值有什么区别?开始阅读 ›35字符串拼接效率怎么提升?strings.Builder 为什么快?开始阅读 ›36★ 错误链 errors.Is/As 与 fmt.Errorf %w 怎么用?开始阅读 ›37net/http 服务端超时怎么控制?keep-alive 又是怎么回事?开始阅读 ›38JSON 编码性能怎么优化?struct tag 有哪些细节?开始阅读 ›39time.Timer/Ticker 与定时任务有哪些常见坑?开始阅读 ›40go.mod 依赖管理与语义化版本是怎么工作的?开始阅读 ›41构建标签、交叉编译与 ldflags 注入版本号怎么做?开始阅读 ›42单元测试的表驱动写法与 httptest 怎么用?开始阅读 ›43★ gin 的中间件与路由实现思路是什么?开始阅读 ›44gorm 有哪些常用特性?软删除、钩子等有哪些坑?开始阅读 ›45grpc 与 protobuf 的基本概念是什么?开始阅读 ›46Go 中选项模式、单例与策略模式怎么落地?开始阅读 ›47接口隔离与依赖注入的轻量做法是什么?开始阅读 ›48错误处理的工程实践:包装、分类与日志怎么配合?开始阅读 ›49从 0 设计一个高并发短链接服务要考虑什么?开始阅读 ›50★ goroutine 池怎么实现?context 在真实服务中如何传递?开始阅读 ›