-
io.Copy更可靠因自动处理缓冲、边界条件和部分写入;必须用io.CopyBuffer时是需复用缓冲区或降低GC压力,建议缓冲区大小为64KB或128KB。
-
expvar.NewInt和expvar.NewFloat有效,但需确保变量被全局引用且命名合法;自定义struct应嵌入expvar.Map并Publish;/debug/vars需手动注册handler;生产环境可安全启用,性能开销极低。
-
goroutine泄漏是定时任务过多的首要隐患,源于未停止time.Ticker/AfterFunc导致goroutine持续存活;需显式Stop、用context控制生命周期、singleflight去重、改用时间轮调度器,并监控goroutine与timer数量。
-
Go程序热更新配置的关键在于安全触发重载与切换:viper.WatchConfig()仅触发回调,需手动ReadInConfig和Unmarshal;推荐用atomic.Value原子替换配置指针,避免锁竞争;环境变量不可热更,HTTP服务中连接池、日志等依赖需主动重建。
-
使用Golang实现ZIP压缩下载功能,通过net/http和archive/zip包将文件流式写入HTTP响应。示例代码创建HTTP处理器,设置Content-Disposition头触发下载,利用zip.Writer直接压缩多个文件并推送到客户端,避免临时文件生成。关键点包括流式压缩、响应头配置、错误处理与资源释放。支持动态文件列表、目录递归、大文件限流等扩展,适用于API或后台系统集成。
-
CPUPercent首次调用必返回0,因需两次采样做差值;须传非零time.Duration(如1*time.Second),至少调用两次才得有效值;v4版新增context参数且模块路径须为v4,统计口径与top不同需手动求平均。
-
反射调用与接口调用本质不同:前者是运行时动态解析,后者是编译期绑定itab查表跳转;反射不参与类型系统调度,无法替代接口实现,高频场景必须用接口。
-
Go111MODULE=on时gomod强制启用,不看vendor/只要环境变量GO111MODULE=on,无论项目是否在$GOPATH内,也无论有没有go.mod文件,所有go命令(gobuild、gorun、gotest等)都会进入模块模式。此时vendor/目录被完全忽略——哪怕它存在且内容完整,也不会被加载。常见错误现象:gobuild报错cannotloadxxx:cannotfindmoduleprovidingpackagexx
-
Go的sub-benchmark通过b.Run()将基准测试拆分为多个子测试,便于对比不同参数或实现的性能,提升代码清晰度与可维护性。
-
goget-u更新后版本没变,需确认GO111MODULE=on、GOPROXY配置正确,并用gogetmodule@version指定版本,再执行gomodtidy;无内置gomodupgrade,推荐golist-u-mall结合手动升级与测试。
-
Go用泛型实现Result[T]可类型安全封装成功值与错误,避免interface{}的类型断言风险和错误忽略问题,核心在于通过泛型约束、构造函数封装及IsOk/Unwrap等方法强制显式错误处理。
-
Go自定义错误必须实现首字母大写的无参Error()方法返回string,接收者建议用指针以避免状态丢失;Error()仅用于展示,类型断言和errors.Is/As才支撑多态处理。
-
json.Decoder为什么比json.Unmarshal更适合流式嵌套JSON因为json.Decoder是边读边解析,不把整个输入加载进内存,而json.Unmarshal必须拿到完整字节切片才能开始。处理大文件、HTTP响应流、WebSocket消息时,后者容易OOM或卡死。常见错误现象:unexpectedEOF或invalidcharacter'}'aftertop-levelvalue——多半是误把流式数据当单个JSON对象传给json.
-
本文介绍如何使用Go的os/exec标准库启动macOS外部应用(如Safari、TextEdit),并在指定延时后通过进程控制实现优雅关闭,避免依赖第三方封装库导致无法获取进程句柄。
-
defer在return语句确定返回值后、函数栈销毁前执行;命名返回值可被defer修改,非命名则不可;多个defer按注册顺序后进先出执行;参数在defer语句出现时即求值;需谨慎用于资源清理与panic恢复,注意性能开销。