Go问答技术文章
-
Go 的 time.LoadLocation 需要 IANA 时区数据库。精简容器常删除系统 zoneinfo,导致本机正常的程序在运行镜像中报 unknown time zone。本文说明查找来源,并比较安装、复制与内嵌 tzdata 三种修复方式。290 收藏 -
Go 的 time.Time 同时承载墙上时间和进程内单调读数,但 JSON 只序列化可跨进程解释的日历时刻。本文说明丢失原因,以及持久化时间、耗时测量和时间比较的正确分工。479 收藏 -
Ticker.Reset 要求间隔严格大于零,零值或负值会直接 panic;动态配置应先解析并校验,停用周期任务则使用 Stop,并在 select 中配合 nil channel。191 收藏 -
在 Go 泛型约束中,~T 表示底层类型为 T 的全部类型,因此既能接受预声明类型,也能接受以它为底层类型的自定义类型;但方法仍须在约束中显式声明。282 收藏 -
调用泛型函数时,只要普通实参或明确的目标函数类型能唯一推断缺失类型参数,通常可以省略;类型参数只出现在结果中、函数值没有目标类型、nil 等实参不提供类型信息时,就要显式填写。泛型类型则始终需要显式类型实参。484 收藏 -
Go 1.20 起,普通接口类型可以作为 comparable 约束的类型实参,但接口动态值仍可能因为切片、map 或函数而在比较时 panic。本文区分接口可比较、严格可比较和约束满足规则,并给出泛型函数与 map 键的判断清单。129 收藏 -
Go 中可寻址的值能调用指针接收者方法,是编译器对方法调用做了隐式取地址;接口实现仍严格取决于静态类型的方法集。本文用最小示例解释 T 与 *T 的差异,并给出赋值、API 设计和编译期断言的修复建议。189 收藏 -
Go 类型断言返回 ok=true 只说明接口的动态类型匹配,断言出的指针仍可能为 nil。本文给出双重判断、反射边界、源头修复和回归测试写法。197 收藏 -
Go 接口里装入 nil 指针后,接口本身通常不等于 nil。本文从动态类型与动态值解释原因,并给出类型断言、反射判断和返回值设计方案。390 收藏 -
Go 多个发送方共享 channel 时,接收方无法判断所有发送是否结束,贸然 close 会与发送竞争并触发 panic。本文给出 WaitGroup 唯一关闭者与 context 取消写法。173 收藏 -
Go select 多个发送或接收分支同时就绪时会均匀伪随机选择,本文说明 case 顺序、default、关闭通道和 nil 通道的边界,并给出优先级处理方案。339 收藏 -
nil channel 永远无法完成发送或接收,因此对应 select case 永远不会进入可执行候选集。本文用双输入 fan-in 说明置 nil 的动态门控模式,并对比关闭通道、空通道、全 nil 死锁与上游泄漏等边界。234 收藏 -
Go sync.Cond 的 Wait 返回只表示收到通知,不代表共享条件已经成立。本文用队列式示例说明为什么必须在循环中重新检查条件,并梳理 Signal、Broadcast 与锁的配合边界。339 收藏 -
Go 的 sync.Mutex 首次使用后不能复制。本文用结构体赋值和值接收者说明复制如何造成永久等待或保护失效,并给出指针接收者、go vet 与并发测试的修复清单。416 收藏 -
json.RawMessage 本质上是保存原始 JSON 字节的切片,普通赋值只复制切片描述,两个变量仍可能共享底层数组。本文用 Unmarshal 和直接修改两个场景定位别名来源,并给出 bytes.Clone、append 到 nil 切片的深拷贝写法与隔离检查清单。109 收藏