-
Go无开箱即用负载均衡器,需基于httputil.NewSingleHostReverseProxy自研;注意URL格式、Header克隆、健康检查、线程安全轮询及故障传播控制。
-
GOVERSION文件才是Go版本执行依据,必须与go.mod一致并置于根目录;私有proxy需禁用fallback、配置GOINSECURE;全局环境变量须通过shell脚本或Dockerfile设置,禁用goenv-w;CI须用目标GOROOT编译校验stdlib兼容性。
-
Go中struct仅当类型名完全一致且所有字段可比较时才支持==比较;否则需用reflect.DeepEqual或手写Equal方法,注意interface{}包裹后==恒为false。
-
Envoy中gRPC超时常不生效,因默认仅转发grpc-timeoutheader而不注入;需在route中同时配置timeout和max_stream_duration,并确保后端解析该header;路由匹配应避免pathprefix,改用header_matchers或转义正则;CPU高多因grpc_json_transcoder未限流或ALPN未启用;状态详情透传需开启grpc_stats的emit_filter_state并传递grpc-status-details-binheader。
-
一致性哈希是分布式缓存分片的必需方案,因其将节点与数据映射到0~2³²−1哈希环上,节点增减仅影响相邻区间数据,配合虚拟节点可使重映射比例降至1%以内,而传统取模分片在节点变化时会导致约75%的key重映射,极易引发缓存雪崩。
-
excelize是Go生态处理.xlsx最可靠的选择,但需注意文件必须符合OOXML规范、强制启用隐藏Sheet需设SkipUnsupportedSheets为false、读中文/日期/公式须判类型并显式计算、写大数据应批量操作或流式输出。
-
G不绑定M,M也不固定属于P;但运行中的G必须在M上执行,每个M必须持有且仅持有1个P才能执行用户代码,这是调度成立的最小契约。
-
Go配置解析需区分文件读取与内容格式错误,用errors.As精准捕获viper或原生包异常,结合自定义校验、结构体tag和统一错误包装提升可维护性。
-
单个Goroutine初始栈约2KB,但泄漏时十万例可占200MB+内存并引发GC与调度恶化;需用runtime.MemStats.StackInuse和pprof/goroutine?debug=2定位卡死协程,避免“一请求一goroutine”导致栈膨胀、僵尸协程及GC压力。
-
Go标准库无image.Resize,编译报undefined;最稳方案是golang.org/x/image/draw配合显式创建*image.RGBA目标图、尺寸校验及类型转换,避免panic和alpha丢失。
-
atomic.LoadInt64读到0或旧值主因是变量未8字节对齐(尤其struct非首字段或局部变量),或混用裸读写;须确保int64首字段、全程用atomic接口、初始化也用atomic.StoreInt64。
-
RedisPubSub容易丢消息,因其非线程安全、默认缓冲区仅10条、无超时控制易卡死goroutine、重连不自动恢复订阅、无ACK机制且panic或慢处理会导致缓冲区溢出。
-
应使用每条消息独立的time.Timer而非全局time.Ticker实现重发,绑定seqID和retryCount状态,收到ACK即stop并清除,失败后reset支持指数退避。
-
Go中interface{}值的相等性比较依赖于其底层动态类型是否可比较;若类型不可比较(如含slice、map、func或包含此类字段的struct),直接使用==会导致编译错误,需改用reflect.DeepEqual或自定义逻辑。
-
Go不支持循环导入,编译时报错“importcyclenotallowed”,需通过接口抽象、依赖倒置、分层设计、回调注入和包结构重构来解耦,核心是明确模块边界与职责。