doulan0297 2016-12-13 21:41
浏览 84
已采纳

编组时间字段为Unix时间

I want to encode my time.Time fields as numeric Unix time and I would prefer not to implement custom MarshalJSON functions for each and every struct, since I have lots and lots of structs.

So, I tried defining a type alias as such:

type Timestamp time.Time

And implementing MarshalJSON on it like so:

func (t Timestamp) MarshalJSON() ([]byte, error) {
    return []byte(strconv.FormatInt(t.Unix(), 10)), nil
}

But that gives me a t.Unix undefined (type Timestamp has no field or method Unix), which doesn't make sense to me. Shouldn't Timestamp 'inherit' (I know that's probably the wrong term) all functions of time.Time?

I also tried using a type assertion like so:

strconv.FormatInt(t.(time.Time).Unix(), 10)

But that also fails, complaining about an invalid type assertion: invalid type assertion: t.(time.Time) (non-interface type Timestamp on left)

  • 写回答

1条回答 默认 最新

  • doujuxin7392 2016-12-13 21:51
    关注

    You need to convert your type back to a time.Time to have access to its methods. Named types do not "inherit" the methods of their underlying types (to do that, you need embedding).

    func (t Timestamp) MarshalJSON() ([]byte, error) {
        return []byte(strconv.FormatInt(time.Time(t).Unix(), 10)), nil
    }
    

    Also, just as a matter of personal preference, I tend to preferred fmt.Sprintf("%v", i) over strconv.FormatInt(i, 10) or even strconv.Itoa(i). Honestly not sure which is faster, but the fmt version seems easier to read, personally.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 stm32循迹小车代码问题
  • ¥15 输入一堆单词,使其去重输出
  • ¥15 qc代码,修改和添加东西
  • ¥50 Unity的粒子系统使用shadergraph(内置管线)制作的一个顶点偏移shader,但是粒子模型移动时,顶点也会偏移
  • ¥15 如何用python处理excel的数据(极值标准化)
  • ¥15 三向应力状态求剪应力
  • ¥15 jupyter notebook如何添加libGL.so.1库
  • ¥20 easyPoi能否实现下拉多选或者复选框
  • ¥15 网桥在转发帧时,会变帧的源地址和目的地址吗?
  • ¥15 用Multisim设计汽车尾灯控制电路