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

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

Mary-Kate Olsen
リリース: 2024-10-28 17:12:02
オリジナル
953 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート