Go语言技术文章
-
Go语言通过合理配置Server参数、启用Keep-Alive、限制连接数及监控连接状态,可有效优化高并发下HTTP服务的性能与资源管理。497 收藏 -
Go1.16+默认启用模块模式,GO111MODULE=on强制依赖go.mod/go.sum管理,绕过GOPATH;gomodtidy才是同步依赖的权威命令,vendor是可重现构建快照,go.sum用于即时校验而非防篡改。130 收藏 -
Go函数参数均为值传递,slice/map/channel/interface传的是含指针的结构体副本,故修改元素或写入键值会影响原变量,但重赋值不会;需替换整个结构时须显式传指针。483 收藏 -
重试机制与幂等性需协同设计:重试仅针对网络类错误并采用带抖动的指数退避,幂等通过request_id查重、状态机或唯一约束实现,二者结合保障RPC可靠性。497 收藏 -
Go中无标准BM25库,需手写核心逻辑:预计算IDF、传入k1/b参数、确保分词后为token数而非字符数,并统一预处理(小写、去停用词、词干化等)以对齐Elasticsearch结果。470 收藏 -
bufio.Scanner读整行最稳:它按行切分、自动丢换行符、内置缓冲、可处理大文本;需先调Scan()再取Text(),错误用Err()检查,默认单行上限64KB。131 收藏 -
gRPCServer默认无连接数限制,实际受限于操作系统和Go运行时;需通过KeepaliveParams管理连接生命周期,并用拦截器+令牌桶限流控制并发请求。231 收藏 -
“cannotdeterminemodulepath”错误是因为Go无法推断合法模块路径,需显式执行gomodinitgithub.com/user/repo(不能省略路径),且项目不能位于$GOPATH/src内。438 收藏 -
推荐使用流式读写处理大文件,通过bufio缓冲分块读取避免内存溢出,按行处理可用Scanner,大块读取用固定buffer,随机访问可选mmap,注意缓冲区大小、资源释放与对象复用,结合场景平衡性能与内存。479 收藏 -
应选用golang.org/x/time/rate的rate.Limiter——基于令牌桶、线程安全、经高并发验证;避免手写实现,注意burst与r的语义、按用户隔离实例、用Wait而非Allow、配合Header返回限速状态、不跨节点共享、SetLimitAndBurst支持运行时调整。169 收藏 -
Go包管理核心在于统一行为约束:go.mod和go.sum必须提交,变更须经goget/tidy/edit;私有模块需配置GOPRIVATE;vendor是否提交取决于CI构建方式,且必须校验一致性。288 收藏 -
最稳妥的做法是用Viper按优先级合并多源配置并原生支持多环境切分,通过命名规范(如config.dev.yaml)、SetConfigName/AddConfigPath、环境变量或命令行控制加载,显式声明mapstructuretag,禁用生产环境WatchConfig,并启动时打印生效配置。457 收藏 -
选用高效序列化协议如Protobuf或MessagePack替代Gob,精简传输字段,复用缓冲区降低GC压力,并按需启用压缩,可显著提升GoRPC性能。428 收藏 -
Homebrew默认安装的Go版本滞后于官网最新稳定版,因其版本发布需审核测试;正确安装指定版本需添加standardnotes/go-versionstap后执行brewinstallgo@x.x;多版本共存时须清理GOROOT硬编码、确保Homebrewbin在PATH前端,并用direnv实现项目级自动切换。261 收藏 -
Go不提供开箱即用负载均衡,因http.DefaultClient和grpc.Dial传入多地址仍只连首个;需自定义RoundTripper用原子索引轮询、克隆请求并设完整URL,健康检查须独立goroutine定时执行。487 收藏