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:
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}
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!