Bagaimanakah saya boleh menggunakan jenis generik dalam fungsi `Unmarshal` Go untuk penghuraian JSON selamat jenis tanpa menggunakan penegasan jenis?

Mary-Kate Olsen
Lepaskan: 2024-10-30 01:08:02
asal
507 orang telah melayarinya

How can I use generic types in Go's `Unmarshal` function for type-safe JSON parsing without resorting to type assertions?

generik di Unmarshal, lihat lebih dekat

Generik dalam Go ialah alat yang berkuasa untuk menulis kod yang lebih boleh digunakan semula dan selamat jenis. Walau bagaimanapun, mengenai penggunaan generik dengan Unmarshal, terdapat beberapa cabaran yang perlu kita ambil perhatian.

Dalam Soal Jawab ini, pengguna cuba menggunakan generik untuk mencipta cara yang lebih selamat jenis untuk unmarshal Data JSON ke dalam struct. Masalah yang mereka hadapi ialah mereka tidak dapat menggunakan kekangan jenis pada fungsi GetBody(), yang menyebabkan mereka terpaksa menggunakan penegasan jenis dalam kod mereka.

Sebabnya ialah Go melakukan tidak menyokong penegasan jenis untuk struct, hanya untuk antara muka. Ini bermakna kita tidak boleh menghantar fungsi GetBody() kepada jenis tertentu tanpa terlebih dahulu mengetahui jenis struktur yang tepat.

Satu penyelesaian yang mungkin untuk masalah ini ialah menggunakan pernyataan suis untuk menyemak medan ReportType bagi struct dan kemudian hantar fungsi GetBody() kepada jenis yang sesuai. Walau bagaimanapun, penyelesaian ini tidak begitu elegan dan ia boleh menjadi sukar untuk dikekalkan kerana bilangan jenis berbeza yang boleh terkandung dalam struktur semakin meningkat.

Penyelesaian yang lebih baik untuk masalah ini ialah menggunakan ungkapan suis jenis dalam Fungsi GetBody(). Ini akan membolehkan kami menghantar fungsi GetBody() kepada jenis yang sesuai tanpa perlu menggunakan pernyataan suis. Ini adalah penyelesaian yang lebih elegan dan ia juga lebih boleh diselenggara.

Untuk menggambarkan penyelesaian ini, berikut ialah versi diubah suai fungsi GetBody():

<code class="go">func (c *ReportContainerImpl[T]) GetBody() (T, error) {
    var body T
    var err error
    switch c.ReportType {
    case ReportTypeExportDataPointReport:
        err = json.Unmarshal(c.Body, &body)
    case ReportTypeImportDataPointReport:
        err = json.Unmarshal(c.Body, &body)
    case ReportTypeMissingDataPointReport:
        err = json.Unmarshal(c.Body, &body)
    case ReportTypeSensorThresoldReport:
        err = json.Unmarshal(c.Body, &body)
    }
    return body, err
}</code>
Salin selepas log masuk

Dengan perubahan ini, kami kini boleh menggunakan fungsi GetBody() untuk mendapatkan semula badan struct tanpa perlu menggunakan pernyataan suis. Ini menjadikan kod lebih elegan dan lebih mudah diselenggara.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menggunakan jenis generik dalam fungsi `Unmarshal` Go untuk penghuraian JSON selamat jenis tanpa menggunakan penegasan jenis?. 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!