-
在Go中重命名文件无需预先打开文件;若因业务需要必须先读写文件,则应显式关闭再重命名,避免defer重复关闭或重命名失败——关键在于合理安排Close()调用时机,而非绕弯封装。在Go中重命名文件无需预先打开文件;若因业务需要必须先读写文件,则应显式关闭再重命名,避免defer重复关闭或重命名失败——关键在于合理安排Close()调用时机,而非绕弯封装。Go的os.Rename()是一个纯路径操作函数,它仅接收两个字符串参数(
-
Gin本身无内置优雅关闭,需用http.Server.Shutdown()配合signal监听和context超时,手动管理所有goroutine退出;漏掉任一环节(如ticker、DB、Redis或子goroutine未响应ctx.Done)将导致进程卡住。
-
必须自己实现net.Listener才能实现连接控制,因http.Server不暴露连接池、不提供连接列表、也不支持主动关闭单条连接,仅无条件接受conn并启goroutine处理,需通过包装Listener拦截Accept()和Close()来接管全生命周期。
-
推荐用sync.Map+独立chan+context.Context实现内存级Pub/Sub:sync.Map避免并发写panic和迭代器失效,Range快照语义确保发布一致性;须封装value为struct并避免在Range中Load/Store;每个订阅绑定context防goroutine与channel泄漏。
-
Go闭包是匿名函数引用外层局部变量且逃逸出定义作用域时自然形成的行为;其捕获变量引用而非值快照,导致多个闭包共享同一内存地址。
-
应统一用len(s)==0判断切片是否为空,而非s==nil;因nil切片和空切片len均为0且len()调用安全,而s==nil仅适用于具体切片类型、在interface{}或泛型中会编译失败,且JSON序列化语义不同。
-
swaginit报错主因是缺失或格式错误的//@title等注释,必须位于main包文件中且连续无空行;类型需显式import、结构体及字段均须首字母大写并带jsontag;docs目录须与二进制同级;CI中需指定-g入口文件路径。
-
用chanstruct{}可实现固定容量信号量:make(chanstruct{},N)创建容量为N的通道,发送操作占用槽位、接收操作释放槽位,从而控制最多N个goroutine并发执行。
-
必须由发送方关闭且仅一次;接收方关、多发送方竞相关、defer无条件关均易panic;forrangech退出需channel已关且缓冲数据读完,缺一不可。
-
最直接记录单个goroutine执行时长是入口time.Now()+defer调用time.Since(),需在goroutine内部获取start时间、避免共享,defer中避免高开销操作;配合context.WithTimeout()主动中断超时任务,定期监控runtime.NumGoroutine()防泄漏,用CPUprofile定位阻塞点。
-
fmt.Printf是唯一真正支持格式化输出的函数,因fmt.Print和fmt.Println不解析%动词,无法控制分隔符、宽度、换行及对齐,而fmt.Printf可精准构造结构化输出、补零格式(如%02d)、结构体调试(%+v/%#v),且在高频场景需配合strings.Builder优化性能。
-
Go1.14+默认不使用vendor/目录,即使存在也会联网拉取模块;必须显式加-mod=vendor参数才能强制从vendor/加载,且需确保GO111MODULE=on、有有效go.mod、已运行gomodtidy、GOPROXY=off、GOSUMDB=off及go.sum完整。
-
围绕 Go 1.24 go.mod 的 tool 指令,讲清如何替代 tools.go、固定工具版本、使用 go get -tool/go tool、接入 CI 和团队落地边界。
-
os.ReadFile在HTTPhandler中直接调用必然拖垮并发,因其底层为同步read(2)系统调用,阻塞OS线程;Go调度器仅能腾挪其他goroutine,但M线程数有限,高并发时大量goroutine堆积在syscall.Read状态,导致CPU利用率低、延迟飙升。
-
Go中WebSocket心跳需服务端启用PingHandler并每25秒发ping、客户端每30秒发JSON心跳包,双方均需超时检测(服务端45秒、客户端60秒)并主动断连,同时注意Nginx超时配置与WriteMessage并发安全。