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