本文介绍了在 go 中为自定义时间类型添加 json 编解码能力的同时,保持对 time.time 方法的自然访问的最佳实践——通过结构体嵌入而非类型别名,并详解其用法、限制与注意事项。
在 Go 中,若需为时间类型添加自定义序列化逻辑(如统一时区、精简格式等),开发者常会定义新类型,例如 type MyTime time.Time。但这种类型别名方式会导致所有 time.Time 方法不可直接调用,每次调用前必须显式转换(如 time.Time(t).Add(…)),不仅冗长易错,还破坏可读性与维护性。
更优解是采用结构体嵌入(embedding):
type MyTime struct {
time.Time
}
该写法使 MyTime 自动获得 time.Time 的所有导出方法(如 Add, Before, Format 等),无需手动转换即可调用:
t := MyTime{time.Now()}
t.Time = t.Add(1 * time.Hour) // ✅ 直接使用 Add,再赋值回嵌入字段
同时,你仍可自由实现接口方法,例如定制 JSON 序列化: