2016-12-13 5 views
0

私はtime.Timeフィールドを数値のUnix時刻としてエンコードしたいので、たくさんの構造体があるので、それぞれの構造体にカスタムMarshalJSON関数を実装したくないです。時刻フィールドをUnix時刻として整列する

だから、私のようなタイプの別名を定義しようとした:

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) 

しかし、それはまた、無効な型アサーション不満、失敗する:あなたが持って戻っtime.Timeにあなたのタイプを変換する必要がありinvalid type assertion: t.(time.Time) (non-interface type Timestamp on left)

答えて

1

そのメソッドへのアクセス。名前付きの型は、基になる型のメソッドを "継承"しません(これを行うには、embeddingが必要です)。

また、単に個人の好みの問題として、私はstrconv.FormatInt(i, 10)あるいはstrconv.Itoa(i)好まfmt.Sprintf("%v", i)する傾向があります。正直なところ、どちらが速いのかわからないが、fmtのバージョンは個人的に読みやすくなっているようだ。

関連する問題