ホームページ  >  記事  >  バックエンド開発  >  アンマーシャリング時にカスタム時間型エイリアスが予期しない結果を出力するのはなぜですか?

アンマーシャリング時にカスタム時間型エイリアスが予期しない結果を出力するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-28 17:12:02876ブラウズ

Why Does My Custom Time Type Alias Output Unexpected Results When Unmarshaling?

カスタム時間型エイリアスの予期しない出力

カスタム時間型エイリアスをアンマーシャリングしようとすると、結果として予期しない出力が得られる場合があります。次のコードを考えてみましょう:

<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 つのオプション:

  1. fmt.Stringer を実装します:

time.Time の String メソッドに委任する String メソッドを Time 型に追加します。 :

<code class="go">func (t Time) String() string {
    return time.Time(t).String()
}</code>
  1. time.Time を埋め込みます:

Time タイプを、エイリアスの代わりに time.Time を埋め込むように変更します。これにより、String メソッドとその他すべての time.Time メソッドが自動的に継承されます。Time:

<code class="go">type Time struct {
    time.Time
}</code>

追加の改善点

  • JSON をデコードするには常に json.Unmarshal を使用します。手動解析を避けるために文字列を使用します。
  • タイム ゾーンの解釈を正確に制御するには、time.ParseInLocation の使用を検討してください:
<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。