Bagaimanakah Saya Boleh Menyahmarshal JSON dengan Jenis Generik dalam Go 1.18 dengan Selamat?

Patricia Arquette
Lepaskan: 2024-11-01 12:35:02
asal
772 orang telah melayarinya

How Can I Safely Unmarshal JSON with Generic Types in Go 1.18?

Penggunaan Generik dalam Unmarshal (Go 1.18)

Apabila menggunakan generik dalam Go 1.18, seperti mencipta bekas untuk menyimpan pelbagai jenis laporan, kekangan jenis boleh timbul. Pertimbangkan persediaan berikut:

  • Berbilang jenis laporan yang diwakili oleh struct
  • Pembungkus ReportContainer dengan parameter jenis generik Reportable, dikekang untuk melaksanakan antara muka Reportable
  • Diskriminator ReportType untuk menentukan jenis laporan konkrit semasa unmarshalling

Anda mungkin menghadapi cabaran dengan kekangan jenis pada jenis pulangan, yang membawa kepada "semantik teks bebas" dalam fungsi GetBody() untuk menampung penegasan jenis.

Cabaran dan Penyelesaian

Isu ini berpunca daripada Go not menyokong penegasan jenis untuk struct dan tidak membenarkan penunjuk kepada jenis generik. Untuk menangani perkara ini, anda boleh membuat antara muka yang melaksanakan Getters untuk LocationID, Provider, ReportType dan Body. Walau bagaimanapun, penyelesaian ini memerlukan pengorbanan keselamatan jenis.

Pendekatan yang lebih selamat melibatkan pelepasan polimorfisme parametrik dan menggunakan pernyataan suis konkrit berdasarkan nilai diskriminator semasa pembongkaran JSON. Ini memastikan bahawa jenis konkrit yang betul digunakan untuk setiap jenis laporan.

Pendekatan Alternatif

Untuk penghuraian JSON dinamik, anda boleh menggunakan fungsi unmarshal generik:

<code class="go">func unmarshalAny[T any](bytes []byte) (*T, error) {
    out := new(T)
    if err := json.Unmarshal(bytes, out); err != nil {
        return nil, err
    }
    return out, nil
}</code>
Salin selepas log masuk

Walaupun fungsi ini menawarkan fleksibiliti, adalah penting untuk ambil perhatian bahawa jika pelaksanaannya adalah minimum, ia hanya melakukan tindakan yang sama seperti menyelaraskan logik unmarshalling secara langsung. Oleh itu, penggunaan fungsi ini hanya dibenarkan jika ia memperkenalkan logik tambahan.

Ringkasnya, pertimbangkan dengan teliti keperluan generik apabila bekerja dengan jenis konkrit dan JSON unmarshalling. Pilih penyelesaian berasaskan suis apabila perlu tanpa menjejaskan keselamatan jenis dan berhati-hati apabila menggunakan fungsi generik yang tidak perlu menduplikasi fungsi.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyahmarshal JSON dengan Jenis Generik dalam Go 1.18 dengan Selamat?. 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!