-
我的 Go 服务从一个 interface 里取值时写了 s := val.(string)、平时跑得稳稳的,某天上游传进来一个不是字符串的值整个服务当场 panic 崩溃,我盯着堆栈愣了半天才想起来 Go 的类型断言还有个带逗号 ok 的安全形式而我图省事用的那个单返回值版本断言失败是会直接炸的深度复盘
我有段 Go 代码从一个存着 any(interface{})的地方取出一个值,我知道它应该是字符串就直接 s := val.(string) 拿来用,上线后跑了很久平安无事,因为上游一直传的都是字符串。直到某天上游因为一个边缘场景传进来一个 nil(或一个数字),整个服务就崩了:日志里一行刺眼的 panic: interface conversion: interface {} is nil, …- 3
- 0
-
我把两个结构体用 == 比一下是否相等,大多数时候都好好的,可某天程序突然 panic 挂了、报 comparing uncomparable type,排查半天才发现这个结构体里多了个切片字段、而 Go 里压根不是所有类型都能用 == 比较的深度复盘
我有个 Go 结构体,平时拿两个实例用 == 比是否相等(判重、查变化),一直用得好好的,编译从不报错。后来需求变了我给它加了个切片字段,代码照常编译通过测试也大体能跑,我没多想。可上线后程序某个时刻突然 panic:runtime error: comparing uncomparable type。我盯着报错那行 a == b 一头雾水:这不就是个普通相等比较吗,之前一直好好的凭什么突然不可比…- 0
- 0
-
我用一个 channel 收集多个 worker 的结果,某个 worker 干完顺手把 channel 关了,其他还在干活的 worker 一发送就 panic:send on closed channel,一次 Go channel 关闭所有权的深度复盘
我用多个 worker goroutine 并发处理任务,每个 worker 把结果发到一个共享的 results channel,主 goroutine 收集。为了发完就通知结束,我让每个 worker 干完后 close(results)。功能偶尔能跑,可线上常崩 panic: send on closed channel。推演时序才明白:这个 channel 是多个 worker 共享发送的…- 0
- 0
-
我读那个 map 一直好好的,直到某次往里写了一个键,程序当场 panic:assignment to entry in nil map,一次 Go 里 nil map 读得写不得、未初始化被读操作掩盖的深度复盘
我有个 struct 里有个 map 字段 cache,某些地方读它一直没问题;直到某次代码走到一个分支往 cache 里写 m.cache[key]=value——当场 panic: assignment to entry in nil map,goroutine 崩了。这 map 前面明明读得好好的,怎么一写就说是 nil?捋一遍才明白:这个 cache 从来没 make 过、值是 nil(m…- 0
- 0
-
我的 Go 程序往一个 struct 里的 map 字段写值就 panic,可同一个 struct 里的 slice 字段 append 却好好的,我对着 nil map 排查了大半天的复盘
用 Go 写数据聚合,定义了个 struct 里有 map 字段和 slice 字段,创建实例后往 slice append 元素一切正常,可往 map 写值那行直接 panic: assignment to entry in nil map。满脸问号:同一个 struct、同样创建后就用、同样是集合类型,凭什么 slice 能用 map 就崩?排查大半天才理解 Go 的零值哲学,以及 nil m…- 0
- 0
panic
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!





