-
以慢接口排查为线索,讲 Go pprof 的 CPU、heap、goroutine、block profile 使用顺序和常见误判。
-
从线上排障角度讲 errors.Is/As、fmt.Errorf %w、错误分层、日志上下文和用户可见错误的边界。
-
net/http.Hijacker是Go标准库中用于劫持HTTP连接的接口,必须在需绕过HTTP协议栈直接操作底层TCP连接时使用,如WebSocket升级、HTTPS代理隧道、自定义二进制协议等;调用前响应未写出,且HTTP/2环境下不可用。
-
为什么http.ServeMux不够用?它只支持前缀匹配,比如注册/api会意外匹配到/api/users/delete,但无法提取:id或*path这类动态段。更麻烦的是,它不支持方法区分——GET/users和POST/users必须手动在handler里判断,逻辑容易散落。常见错误现象:404频发却查不出路由是否注册、调试时发现两个相似路径(如/user/:id和/user/new)谁先谁后影响匹配结果、升级Go版本后路由行为突变(因http.Ser
-
Go1.14+默认不使用vendor/目录,即使存在也会联网拉取模块;必须显式加-mod=vendor参数才能强制从vendor/加载,且需确保GO111MODULE=on、有有效go.mod、已运行gomodtidy、GOPROXY=off、GOSUMDB=off及go.sum完整。
-
trace_id为空主因是context未透传到位;HTTP入口须用私有struct{}作key注入,zap需封装WithContext自动提取,goroutine和DB调用必须显式传ctx,HTTP/gRPC出站需双写header/metadata。
-
多协程数据共享需保证并发安全,Go提供多种机制:使用sync.Mutex或RWMutex加锁保护共享资源,避免竞态条件;优先通过channel通信传递数据而非共享内存,提升代码清晰度与安全性;对计数器等简单变量采用sync/atomic原子操作提高性能;结合context管理协程生命周期,防止泄漏。根据场景选择合适方式:简单操作用原子类型,结构化数据用互斥锁,协作任务用channel通信,可实现高效安全的并发编程。
-
Go的flag包默认按字母序输出帮助信息,无法直接关闭排序;但可通过自定义flag.FlagSet和重写Usage函数,实现按代码中声明顺序展示命令行参数。Go的flag包默认按字母序输出帮助信息,无法直接关闭排序;但可通过自定义`flag.FlagSet`和重写`Usage`函数,实现按代码中声明顺序展示命令行参数。在Go标准库的flag包中,-h或--help输出的帮助文本默认由flag.PrintDefau
-
用[]T切片实现栈最安全高效;interface{}栈因类型擦除易panic且性能差2–4倍;list.List非LIFO设计、GC压力大、缓存不友好。
-
sysmon是Go运行时中不依赖P、独立运行于M上的后台监控协程,负责轮询检查网络事件、抢占长时间运行的G、触发GC及回收空闲P等,但不直接唤醒M——它仅通过notewakeup等机制通知调度器,由OS系统调用最终完成唤醒。
-
bufio.Scanner默认按行分割,需用Split函数自定义分隔逻辑;SplitFunc须处理data不完整和atEOF状态,正确实现三步:找分隔符、切token、更新剩余数据。
-
直接用etcd+go-etcd就够了,因其强一致、高可用,client/v3提供简洁API和Watch机制可实现实时同步;自建方案需额外处理监听、版本比对、断线重连等复杂边界问题。
-
用chanstruct{}可实现固定容量信号量:make(chanstruct{},N)创建容量为N的通道,发送操作占用槽位、接收操作释放槽位,从而控制最多N个goroutine并发执行。
-
Gin本身无内置优雅关闭,需用http.Server.Shutdown()配合signal监听和context超时,手动管理所有goroutine退出;漏掉任一环节(如ticker、DB、Redis或子goroutine未响应ctx.Done)将导致进程卡住。
-
在Go中重命名文件无需预先打开文件;若因业务需要必须先读写文件,则应显式关闭再重命名,避免defer重复关闭或重命名失败——关键在于合理安排Close()调用时机,而非绕弯封装。在Go中重命名文件无需预先打开文件;若因业务需要必须先读写文件,则应显式关闭再重命名,避免defer重复关闭或重命名失败——关键在于合理安排Close()调用时机,而非绕弯封装。Go的os.Rename()是一个纯路径操作函数,它仅接收两个字符串参数(