-
Go 服务里调用 http.Client 后,Response.Body 没有在所有路径关闭,连接会被持续占用,pprof 里常能看到 net/http 相关 goroutine 增长。用 defer resp.Body.Close()、完整处理响应体、复用 Client,并通过压测与连接指标复查,可以把这类问题收住。
-
MakeFunc生成的函数必须严格匹配目标签名,否则panic;需用reflect.TypeOf((*T)(nil)).Elem()获取原始类型,in/out切片须与参数/返回值数量类型完全对齐,闭包中调用原函数要注意reflect.Call性能开销和panic传播问题。
-
Go中无enum关键字,仅能通过const块+iota实现编译期整数常量枚举;iota在同const块中从0自动递增,支持跳过、偏移、位运算等变形用法。
-
本文介绍使用Go的map[string]interface{}动态解析JSON,快速提取嵌套字段(如Solr响应中的"response"),避免繁琐的struct定义,兼顾灵活性与开发效率。
-
database/sql自带连接池,需全局单次sql.Open并调用db.Ping();SetMaxOpenConns与SetMaxIdleConns需满足前者≥后者,建议按峰值QPS×平均耗时×1.5估算并取数据库max_connections的70%为上限,Idle设为Open的1/2~2/3;SetConnMaxLifetime应略小于数据库wait_timeout(如MySQL300s设240s),避免stale连接。
-
sync.Map不适合多级缓存,因其仅为单层线程安全哈希表,缺乏过期、驱逐、穿透保护及层级联动能力,无法满足“本地快+远程稳+自动降级”核心诉求。
-
Go实现SSE推送核心是设对响应头、每次写完立刻flush、禁用超时;漏任一环节,EventSource即卡在connecting状态。
-
WebSocket连接建立后立刻断开,是因为Upgrade()前调用了WriteHeader()或Write()导致响应头已发送;广播时goroutine泄漏源于读循环无退出条件或同步广播;多客户端收不到消息因map并发读写未加锁;部署后连不上常因反向代理未透传Upgrade和Connection头。
-
sync.Map不适合高频配置读取,因Load需原子操作和指针跳转,比RWMutex读慢2–3倍;它不支持可靠遍历,Store可能触发dirty提升引发毛刺;纯读多场景应选RWMutex+带版本号map。
-
Java开发者写Go时最常写的“伪Go代码”是滥用interface{}、误用Optional、循环goroutine变量捕获错误、panic代替error处理、错误理解Gomodule版本机制;核心在于放弃Java框架思维,回归Go的显式、静态、组合哲学。
-
Go语言通过显式返回error类型处理错误,调用者需主动检查并处理。1.函数执行后返回error,nil表示成功,非nil表示失败,必须判断err避免忽略错误。2.使用fmt.Errorf搭配%w包装错误,保留原始错误链,便于使用errors.Is或errors.As进行比较和类型断言。3.可定义实现error接口的结构体携带额外信息(如Code、Message),用于HTTP状态码映射等场景。4.在panic场景下,通过defer配合recover捕获异常并转为普通错误,但应仅用于不可恢复或第三方库引发
-
必须先创建Stream,否则Publish会panic;JetStream需显式初始化并配置存储策略,连接后须调用jetstream.New(nc)或nc.JetStream()检查错误,且服务端必须启用-js参数,客户端需显式设置StorageType、DeliverPolicy、MsgID与Duplicates等关键参数。
-
Go语言不支持方法重载,同名但参数不同的方法会编译失败;应通过不同方法名、接口实现、可变参数、结构体选项或类型断言等惯用方式替代,契合其简洁、显式、类型安全的设计哲学。
-
从批量调用下游接口的并发扇出场景出发,讲清 errgroup.WithContext、Go、Wait、SetLimit、TryGo、错误传播、Context 取消和结果聚合的生产写法。
-
gopsutil的CPU和内存数值与top、free不一致,因默认返回累计值而非瞬时率;CPU需两次调用取差值,内存应基于Available计算真实使用率,磁盘IO需限定设备并加超时控制。