Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Alias ​​Jenis Masa Saya dalam Go Menghasilkan Output Tidak Dijangka Apabila Dicetak?

Mengapa Alias ​​Jenis Masa Saya dalam Go Menghasilkan Output Tidak Dijangka Apabila Dicetak?

Barbara Streisand
Barbara Streisandasal
2024-10-30 05:35:28622semak imbas

 Why Does My Time Type Alias in Go Produce Unexpected Output When Printed?

Output Tidak Dijangka dengan masa. Alias ​​Jenis Masa

Dalam Go, kaedah UnmarshalJSON untuk jenis tersuai memberi peluang untuk menyesuaikan cara nilai JSON tidak dikawal. Satu kes penggunaan yang popular ialah mengubah suai perwakilan nilai masa. Walau bagaimanapun, apabila menggunakan alias jenis untuk masa. Masa, penjagaan mesti diambil untuk memastikan output yang dijangkakan.

Pertimbangkan coretan kod berikut:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
    "strings"
    "time"
)

type Time time.Time // Custom type alias for `time.Time`

func (st *Time) UnmarshalJSON(b []byte) error {
    s := strings.Trim(string(b), "\"")
    t, err := time.Parse(time.RFC3339, fmt.Sprintf("%sZ", s))
    if err != nil {
        return fmt.Errorf("parse time: %w", err)
    }
    *st = Time(t)
    return nil
}

type User struct {
    Name string
    TS Time // Field of type `Time`
}</code>

Dalam contoh ini, UnmarshalJSON tersuai kaedah ditakrifkan untuk jenis Masa untuk menukar perwakilan rentetan JSON kepada masa. Nilai masa. Apabila menghuraikan rentetan JSON, kaedah menambahkan huruf "Z" ke penghujung untuk memastikan zon waktu ditetapkan kepada UTC.

Walau bagaimanapun, jika anda cuba mencetak nilai Pengguna yang tidak dimarshall menggunakan fmt.Printf, anda mungkin melihat keluaran yang tidak dijangka:

&{Name {958450000 63757163420 <nil>}}

Output ini mengelirukan kerana ia tidak mewakili nilai masa dengan jelas.

Sebab bagi gelagat ini terletak pada cara Go memformat jenis tersuai. Pakej fmt mempunyai logik pemformatan lalai untuk jenis terbina dalam, tetapi untuk jenis tersuai, ia kembali untuk mencetak medan jenis asas. Dalam kes ini, Masa ialah jenis alias untuk masa. Masa, jadi apabila memformat, fmt mencetak medan asas masa. Masa, menghasilkan output yang mengelirukan.

Penyelesaian

Untuk menyelesaikan isu ini, anda boleh mengambil salah satu daripada dua pendekatan:

  1. Laksanakan fmt.Stringer Interface:

Tentukan kaedah String untuk jenis Masa anda yang mewakilkan kepada kaedah String masa.Masa:

<code class="go">func (t Time) String() string {
    return time.Time(t).String()
}</code>

Dengan kaedah ini disediakan, fmt akan menggunakan logik pemformatan tersuai apabila mencetak nilai Pengguna:

&{Name 2021-05-21 03:10:20.95845 +0000 UTC}
  1. Benamkan masa.Masa:

Sebagai alternatif, anda boleh membenamkan masa.Masa terus ke dalam jenis Masa anda:

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

Pendekatan ini mewarisi semua kaedah masa. Masa, termasuk kaedah String, yang memastikan output yang dijangkakan semasa pemformatan.

Satu lagi pertimbangan penting apabila bekerja dengan nilai masa ialah menggunakan pakej pengekodan/json untuk JSON marshaling dan unmarshaling. Menghuraikan rentetan JSON secara manual boleh menyebabkan ralat atau pengendalian data yang salah.

Atas ialah kandungan terperinci Mengapa Alias ​​Jenis Masa Saya dalam Go Menghasilkan Output Tidak Dijangka Apabila Dicetak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn