我想将time.Time
字段编码为数字Unix时间,我宁愿不为每个结构实现自定义MarshalJSON函数,因为我有很多结构。
所以,我尝试定义类型别名:
type Timestamp time.Time
并在其上实现MarshalJSON:
func (t Timestamp) MarshalJSON() ([]byte, error) {
return []byte(strconv.FormatInt(t.Unix(), 10)), nil
}
但这给了我一个t.Unix undefined (type Timestamp has no field or method Unix)
,这对我没有意义。不应该Timestamp
'继承' (我知道这可能是错误的术语)time.Time
的所有功能?
我也尝试过这样的类型断言:
strconv.FormatInt(t.(time.Time).Unix(), 10)
但这也失败了,抱怨无效的类型断言:invalid type assertion: t.(time.Time) (non-interface type Timestamp on left)
答案 0 :(得分:1)
您需要将类型转换回time.Time
才能访问其方法。命名类型不会“继承”其基础类型的方法(为此,您需要embedding)。
func (t Timestamp) MarshalJSON() ([]byte, error) {
return []byte(strconv.FormatInt(time.Time(t).Unix(), 10)), nil
}
此外,就个人偏好而言,我倾向于fmt.Sprintf("%v", i)
优先于strconv.FormatInt(i, 10)
甚至strconv.Itoa(i)
。老实说,不确定哪个更快,但fmt
版本似乎更容易阅读,个人。