go install装完无法运行,根本原因是GOBIN或$GOPATH/bin未加入PATH;需用go env确认GOPATH/GOBIN值,确保目录存在并导出到PATH,最后用go list std验证环境是否真正就绪。

go install 装完就跑不起来?检查 GOPATH 和 GOBIN
很多人在 macOS 或 Linux 上用 go install 安装了 Go,但执行 go version 报“command not found”,根本原因是 shell 没读到 GOBIN(或 GOPATH/bin)路径。别急着重装,先确认:
- 运行
go env GOPATH和go env GOBIN,看输出是否为空或意外(比如是~/go但你没创建该目录) - 若
GOBIN为空,Go 默认把二进制放$GOPATH/bin;确保该目录存在且已加入$PATH,例如在~/.zshrc加:export PATH="$HOME/go/bin:$PATH" - Windows 用户注意:PowerShell 默认不读
PATH的用户变量,要用系统属性 → 环境变量手动添加,或改用 CMD 测试
验证方式不是看安装日志,而是直接运行 go list std —— 能列出几百个包,说明环境真正就绪。
结构体序列化 benchmark 怎么写才不骗自己
用 go test -bench 测序列化速度时,常见错误是让编译器把整个操作优化掉,或者没复用缓冲区、对象,测出的是 GC 开销而非真实序列化耗时。关键点:
- 必须用
b.ReportAllocs(),否则看不到内存分配是否失控 - 别在
BenchmarkXxx函数里反复new(MyStruct)或make([]byte, 0)—— 这些应提前提前初始化好,放在b.ResetTimer()之后 - 对
json.Marshal,要传指针:json.Marshal(&s),否则值拷贝可能掩盖反射开销 - 对比
easyjson时,调用的是s.MarshalJSON(),不是json.Marshal;漏掉这步等于白生成 - 用
pprof配合看runtime.mallocgc和reflect.Value.Interface占比,才能确认瓶颈真在序列化层
msgpack/v5 编码器不能 new 一百次
github.com/vmihailenco/msgpack/v5 的编码器不是轻量对象,每次 msgpack.NewEncoder 都会新建内部状态和缓冲区,高频调用下 GC 压力陡增。正确姿势是复用:
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
立即学习“go语言免费学习笔记(深入)”;
- 用
msgpack.GetEncoder()从内置sync.Pool拿实例,用完msgpack.PutEncoder(enc) - 别自己
make([]byte, 0, 1024)后传给bytes.NewBuffer——GetEncoder返回的 encoder 已预设好 buffer 复用逻辑 - 如果结构体含大量重复字符串(如日志中的
"level","service"),加enc.UseInternedStrings(true),能省 15–20% 内存 - 注意:
UseInternedStrings不是全局开关,它只对当前 encoder 实例生效,别在循环里反复 set
easyjson 生成后忘记 import 对应文件
运行 easyjson -all user.go 生成 user_easyjson.go 后,很多人直接改调用为 u.MarshalJSON(),却忘了在 main 包或测试文件里 import "./" 或确保生成文件在 go build 路径中。结果编译报错:u.MarshalJSON undefined,但 struct 定义明明有。
- 生成的
*_easyjson.go文件必须和原 struct 在同一 package,且被go build或go test扫描到 - 如果用
go mod,且生成文件放在子目录(如gen/),需在go.mod中显式 replace 或用//go:generate确保生成位置正确 - 最稳做法:生成文件和源文件同目录,且文件名不以
_test.go结尾(否则go test不加载) - 生成后立刻跑
go vet ./...,能提前发现方法未绑定问题
真正卡住的往往不是选哪个库,而是生成代码没进构建流程、复用逻辑写在 for 循环里、或者 benchmark 里连 b.ReportAllocs() 都没开 —— 这些地方一漏,数据就不可信。

















