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

Barbara Streisand
Lepaskan: 2024-10-30 05:35:28
asal
562 orang telah melayarinya

 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>
Salin selepas log masuk

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>}}
Salin selepas log masuk

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>
Salin selepas log masuk

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

&{Name 2021-05-21 03:10:20.95845 +0000 UTC}
Salin selepas log masuk
  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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!