编组时间字段为Unix时间

时间:2016-12-13 21:41:31

标签: go

我想将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)

1 个答案:

答案 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版本似乎更容易阅读,个人。