-
微服务中Go的error不应直接返回调用方,须统一映射为语义明确的状态码(HTTP)或标准gRPCcode,封装为可识别类型并保留错误链,携带traceID,禁止字符串匹配,确保可观测性与重试策略分层可控。
-
Go服务被KubernetesHPA自动扩缩容的关键是暴露Prometheus格式指标端点(如/metrics),并由metrics-server或prometheus-adapter将其转换为MetricsAPI;HPA本身不拉取指标,仅通过API查询,因此需确保指标名、标签、命名空间在prometheus-adapter规则中精确匹配。
-
嵌套结构体直接用struct类型作字段,无需关键字;字段名是否导出决定包外可见性;JSON等序列化依赖structtag,须加引号;指针支持nil判断和共享数据,值类型适合小结构且必有零值;初始化需手动逐层赋值,避免nilpanic。
-
当结构体字段多、含切片/映射/字符串或嵌套大类型时,应返回指针以避免值拷贝开销;需确保对象生命周期有效,优先堆分配或复用,配合sync.Pool可进一步优化。
-
Go字符串不可变,底层为只读结构体{ptr*byte,lenint},禁止索引赋值;修改需转[]byte或[]rune操作后重建,拼接推荐strings.Builder。
-
Golang无统一存储方案,需据数据特性选方式:临时状态用sync.Map或加锁map;文件存储需原子写入;数据库应抽象接口;Redis存值须序列化且带命名空间前缀。
-
Go模块通过go.mod定义唯一导入路径,如example.com/myproject,结合/internal、/pkg、/cmd等目录规范组织代码,使用replace调试本地依赖,发布时打Git标签并推送到仓库供他人导入。
-
Go通过os.IsNotExist、os.IsExist、errors.Is、errors.As等函数区分IO错误类型,支持文件、网络及系统级错误判断,并可通过fmt.Errorf包装保留原错误,实现精准处理。
-
pprof生成的profile文件需先用gotoolpprof-raw-lines导出为折叠栈文本,再经flamegraph.pl转为SVG火焰图;Web界面无火焰图按钮,需手动访问/ui/flamegraph;线上启用CPUprofiling要限制seconds参数并管控访问权限;符号显示为?或[unknown]是因编译时strip了符号表,应去掉-ldflags="-s"。
-
在Go中启用HTTP响应gzip压缩可显著减小JSON、HTML等文本响应体积,需通过自定义中间件检查Accept-Encoding、设置Content-Encoding,并仅对text/*、application/json等类型压缩,避开图片/PDF等已压缩格式,推荐使用gzip.DefaultCompression(6)及4KB–32KB缓冲区。
-
日常HTTP/gRPC调用优先用retry.Do;需精细控制退避状态才选backoff.Retry。retry.Do开箱即用,封装完整;backoff.Retry更底层但需手动管理实例与上下文,共享会错乱attempt计数。
-
用minio-goSDK连MinIO并上传文件:初始化客户端需endpoint、accessKey、secretKey和secure选项;桶需显式MakeBucket创建;上传用PutObject,传入io.Reader并确保文件指针在开头。
-
可设置性指reflect.Value能否修改底层值,需通过reflect.ValueOf(变量地址).Elem()获取并调用CanSet()判断,仅当变量可寻址且非未导出字段时返回true,否则Set()将引发panic。
-
用colly而非手动组合http.Client+goquery,因其内置反爬、重试、并发控制、去重、Cookie管理及robots.txt遵循等能力;但不支持JS渲染,需注意v2兼容性、状态码检查、合理限速与数据缓冲。
-
errors.Is和errors.As不能直接判断自定义错误类型,因二者依赖Unwrap()实现错误链遍历,若自定义错误未实现Unwrap()(哪怕返回nil),则无法被识别;正确做法是显式实现Unwrap()方法。