GOCACHE=true开启默认缓存(通常位于~/.cache/go-build),避免重复编译未修改的模块;也可通过go build -buildcache=true显式启用。-p参数指定并行编译的goroutine数量(如go build -p 4),充分利用多核CPU缩短编译时间。-ldflags="-s -w"去除符号表和调试信息,减小二进制文件体积(通常可减少30%~50%),提升加载速度。-march=native(匹配本地CPU架构)和-mtune=native(优化指令调度),提升运行时性能;例如为Ubuntu 22.04(AMD 64位)编译可使用:GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o app。map(哈希表,O(1)时间复杂度),有序数据用slice(动态数组,连续内存布局),并发安全用sync.Map(读多写少场景更高效)。new或make),优先复用对象;使用sync.Pool缓存临时对象(如数据库连接、缓冲区),减少垃圾回收(GC)压力。channel替代mutex(互斥锁),实现无锁通信;若必须用锁,使用sync.RWMutex(读写锁)区分读写操作,提升读并发性能。strings.Builder替代+拼接字符串(避免频繁内存分配),尤其适合循环中的字符串构建(性能可提升5~10倍)。int64、string)放在结构体末尾,提升CPU缓存命中率(减少缓存行失效);例如:type OptimizedStruct struct {
SmallField int8 // 1字节
LargeField [1024]byte // 1KB,放在末尾
}
//go:inline指令(Go 1.21+),减少函数调用开销(如fmt.Println的优化)。runtime.GOMAXPROCS(runtime.NumCPU())将Goroutine调度使用的CPU核心数设置为机器物理核心数(避免过多核心导致调度开销),充分挖掘多核性能。ants等第三方库或自定义池(如workerPool)复用Goroutine;例如:pool, _ := ants.NewPool(100) // 初始化100个Goroutine的池
defer pool.Release()
pool.Submit(func() {
// 执行任务
})
semaphore.Weighted或channel限制并发Goroutine数量(如API请求限流、数据库连接池),避免资源耗尽(如文件描述符溢出)。GOGC环境变量控制GC触发频率(默认100%,即堆内存增长到上次GC后的2倍时触发);生产环境可设置为GOGC=200(堆增长到2倍时触发),减少GC次数(但会增加内存使用);Go 1.19+可使用GOMEMLIMIT限制进程最大内存(如GOMEMLIMIT=512MB),避免内存溢出。new),合并小对象为大对象(如将多个int放入struct);使用make预分配slice/map容量(如make([]int, 0, 1000)),避免扩容时的内存复制。runtime.GC()手动触发GC,及时释放未使用的内存(注意:频繁手动GC会影响性能)。/etc/fstab中为SSD添加noatime(不更新文件访问时间)和discard(在线TRIM)选项,减少不必要的磁盘IO;例如:/dev/sda1 / ext4 defaults,noatime,discard 0 1
_ "net/http/pprof"包,启动HTTP服务(如go run main.go),通过http://localhost:6060/debug/pprof/访问分析端点。go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30(采集30秒CPU样本),使用top查看热点函数、web生成调用图(需安装graphviz)、list 函数名查看具体代码行。http://localhost:6060/debug/pprof/heap获取堆内存快照,使用top查看内存占用最高的对象、list 函数名查看内存分配热点。runtime/trace包,生成trace文件(如f, _ := os.Create("trace.out"); trace.Start(f); defer trace.Stop()),通过go tool trace trace.out分析Goroutine调度、GC事件、系统调用等,定位并发瓶颈(如Goroutine阻塞、锁竞争)。io_uring,Go 1.21+实验性支持)、缓冲IO(如bufio.Reader/Writer)、零拷贝技术(如os.File.ReadAt配合mmap),提升IO效率。