-
Go微服务性能监控需聚焦延迟分布、资源水位、请求健康度三大问题:用HistogramVec按path/method/status打标并设业务适配buckets,避免Summary;运行时指标须用rate观察goroutines趋势,GC次数突增比耗时更早暴露内存泄漏;HTTP状态码需正确捕获,pprof必须限访问、控采样时长。
-
unsafe仅在零拷贝切片/字符串构造、结构体字段硬跳、C互操作三类场景值得使用;需严格管控内存生命周期,避免逃逸分配与越界写,禁止对unsafe.Slice返回值append、对unsafe.String底层内存写入、手算字段偏移或拆分uintptr计算。
-
直接用INCR+EXPIRE会因非原子性导致key永久存在而误限流;正确做法是用Lua脚本将计数与过期封装为原子操作,并通过redis.NewScript注册复用。
-
Go允许结构体指针直接用点号访问成员,无需显式解引用;p.Name报错是因运算符优先级导致误解析,正确写法是p.Name或(p).Name。
-
pprof默认暴露goroutineprofile,访问/debug/pprof/goroutines?debug=2首行即为当前协程总数,适合监控;debug=1返回完整栈迹用于排查阻塞,需确保pprof正确注册且生产环境限制访问。
-
govet是Go工具链自带的语义分析检查工具,专查语法合法但逻辑可疑的代码,如printf参数不匹配、range复制结构体、struct标签拼写错误、未用变量、WaitGroup调用顺序错误等。
-
切片和数组的区别在于:1)数组是固定长度的,适合固定长度的数据结构;2)切片是动态的,适合需要动态调整大小的场景。它们的选择取决于具体的应用需求。
-
Go循环变量复用同一内存地址,闭包捕获的是变量引用而非值;所有迭代共享该地址,导致最终均读取终值。
-
Go逻辑运算符要求操作数为bool类型且支持短路求值:&&在左操作数为false时跳过右操作数,||在左操作数为true时跳过右操作数;必须显式比较非布尔值,推荐用括号明确优先级,并善用德·摩根定律简化否定表达式。
-
Go语言可通过reflect包实现通用字段赋值,支持嵌套路径(如"A.B.C")、nil指针自动初始化、数组索引及多类型值转换,需确保字段导出、可寻址且可设置,并封装为SetField(obj,path,value)工具函数。
-
Golang日志收集核心是轻量、可靠、可扩展,关键在设计采集→传输→存储→查询链路:HTTP中间件用结构化JSON日志,通过context注入trace_id,异步channel缓冲+批量发送,失败降级落盘。
-
UberFX强制代码按其结构组织,启动失败常见于缺少构造函数或类型未注册;必须用fx.Provide显式注册返回具体类型的构造函数,fx.Invoke仅接受参数可解析且返回error的函数,自定义日志需实现fxevent.Logger接口,fx.Supply仅适用于具体值注入。
-
Go标准库log包默认不带时间戳、级别和行号,需调用log.SetFlags(log.Ldate|log.Ltime|log.Lshortfile)启用;不支持日志级别,需自行封装;log.Fatal会跳过defer且不保证输出,生产环境应避免在handler中使用。
-
Go语言通过gRPC实现高效远程调用依赖ProtocolBuffers和HTTP/2,流程包括定义.proto接口、生成代码、实现服务端与客户端;2.编写hello.proto定义服务和消息结构;3.使用protoc生成hello.pb.go和hello_grpc.pb.go代码;4.服务端注册Greeter服务并启动监听;5.客户端连接服务端并调用SayHello方法获取响应。
-
Golang通过client-go监听KubernetesNetworkPolicy变化,结合CNI插件或eBPF/iptables实现策略执行,常用于编写控制器、准入控制Webhook及策略分发服务,核心在于API监听与底层网络规则同步。