カスタム時間型エイリアスの予期しない出力
カスタム時間型エイリアスをアンマーシャリングしようとすると、結果として予期しない出力が得られる場合があります。次のコードを考えてみましょう:
<code class="go">type Time time.Time func main() { // Simplified unmarshal code for brevity st := Time(time.Parse(time.RFC3339, "2021-05-21T03:10:20.958450Z")) fmt.Printf("%v\n", st) }</code>
フォーマットされた時間が予想されるため、出力には代わりに次の内容が表示されます:
&{958450000 63757163420 <nil>}
根本原因
問題問題は、Time 型の fmt.Stringer の実装が欠落していることにあります。デフォルトでは、fmt は独自の書式設定ロジックを使用し、基になる time.Time 値のフィールドを中括弧で表示します。
解決策
これを解決するには、次の方法があります。 2 つのオプション:
time.Time の String メソッドに委任する String メソッドを Time 型に追加します。 :
<code class="go">func (t Time) String() string { return time.Time(t).String() }</code>
Time タイプを、エイリアスの代わりに time.Time を埋め込むように変更します。これにより、String メソッドとその他すべての time.Time メソッドが自動的に継承されます。Time:
<code class="go">type Time struct { time.Time }</code>
追加の改善点
<code class="go">func (st *Time) UnmarshalJSON(b []byte) error { var s string if err := json.Unmarshal(b, &s); err != nil { return err } t, err := time.ParseInLocation("2006-01-02T15:04:05", s, time.UTC) if err != nil { return err } *st = Time(t) return nil }</code>
以上がアンマーシャリング時にカスタム時間型エイリアスが予期しない結果を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。