-
fmt.Scanln比fmt.Scan更适配单行输入,它读到换行即止且要求末尾为换行;读数字前宜用fmt.Scanf("%d",&v)并检查返回值,或用bufio.Scanner——它自动处理缓冲、换行与EOF,更可靠。
-
Go语言通过goroutine和调度器实现高效TCP并发处理,使用net.Listener.Accept接收连接并启goroutine处理;为避免资源耗尽,可用带缓冲channel限制并发数、设Read/Write超时、及时关闭连接;结合sync.Pool复用内存降低GC压力,引入context协调连接生命周期,支持优雅关闭。
-
使用client-go创建Secret需构造v1.Secret结构体,Data字段值必须为base64编码后的[]byte,Type(如v1.SecretTypeOpaque)和Namespace必须显式设置;读取时需base64.DecodeString反解;Update必须携带最新ResourceVersion;List时注意命名空间与性能。
-
container/ring不适合滑动窗口因其非连续内存、无容量限制、不支持O(1)头尾操作及随机访问,导致性能差且易漏清理;高效实现应使用切片+head/tail游标,配合2的幂容量与位运算绕回。
-
json.Unmarshal必须传指针,否则解析结果为零值;结构体字段需加jsontag才能匹配JSON键名;类型不匹配会报错,忽略err或缺少tag导致静默失败。
-
Time.After会悄悄吃掉内存,因为它每次调用都新建*Timer,背后绑定goroutine和未读channel;若只取接收端而未消费,channel缓冲区持续积压导致内存泄漏。
-
Jaeger.ClientConfig.Sampler不能热更新,因Tracer初始化后sampler实例被固化且不可替换;需改用jaeger.RemoteSampler,通过agent的sampling端口(如5778)动态拉取策略实现运行时重载。
-
Go编译器在build阶段强制检查import循环依赖并报错,不提供运行时检测;需用golist、gomodgraph、gopls等工具定位环路路径,而非反射或AST调用分析。
-
swaginit需显式指定多目录路径并严格遵循注释格式:-g指定入口文件,-d列出internal/handler等子包;注释字段名、缩进、空格须精确匹配;泛型需手动@Schema声明;Nginx部署注意alias末尾斜杠。
-
不用new或字面量创建对象是为了避免强耦合,工厂方法通过返回接口解耦“谁来造”和“造什么”,适合单一产品族变化;抽象工厂则用于创建相互关联的对象族,保证风格一致。
-
值类型比较按值,指针类型比较地址。1.值类型(如int、string、struct)用==比较内容是否相等;2.指针比较判断是否指向同一地址或都为nil;3.值与指针不可直接比较,需解引用;4.map、slice的指针可比较地址,但本身不可比较。
-
Go中无装饰器语法,中间件链本质是func(http.Handler)http.Handler函数的嵌套组合,执行时形成隐式递归调用链,顺序与包装顺序相反,需确保每层调用next.ServeHTTP且正确传递r/w。
-
Go测试文件须命名为_test.go且与源码同包;测试函数需以Test开头、接收testing.T参数;推荐表驱动测试和t.Run子测试,注意资源隔离与错误传播。
-
panic通过堆栈展开(stackunwinding)逐层执行defer并终止当前goroutine;仅在defer内直接调用recover可捕获,且部分致命panic不可安全恢复。
-
用http.Header获取X-CSRF-Token后,需原子验证其存在性、时效性与未使用性:先查Redis是否已存在该Token(SetNX),若不存在或已过期则拒收;若存在则校验签名与过期时间,全部通过才允许业务处理,否则返回409或422。