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