Go教程技术文章
-
Go中Adapter常“没用上”是因为其本质是函数或类型转换层,用于桥接接口而非类适配;需检查方法签名是否完全匹配、指针接收者要求及error等类型严格性,必要时用wrapper类型或函数适配器实现。425 收藏 -
Go中应手写haversine公式计算地理距离:输入经纬度需转弧度,用6371km地球半径,固定(lat1,lng1,lat2,lng2)顺序;对asin输入做[-1,1]截断防panic;统一用float64防精度误差;手动处理经度跨180°及非法坐标。113 收藏 -
使用高性能第三方库可显著提升Golang中JSON处理性能。优先选择json-iterator/go实现无缝替换,获得30%-50%性能提升;对固定结构体采用easyjson生成静态方法,消除反射开销,性能提高2-5倍;通过sync.Pool复用Buffer和Encoder减少GC压力;优化结构体设计,使用值类型、避免深层嵌套、显式指定字段类型,并跳过无关字段。结合场景选用策略,可有效突破序列化瓶颈。486 收藏 -
使用errors.Is和errors.As精准判断可预期错误,如文件不存在或超时,可安全跳过;通过类型断言或封装函数提高代码可读性,避免无差别忽略错误,确保程序健壮性。304 收藏 -
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 收藏