Generics and Unmarshal in Go 1.18
In Go 1.18, generik membawa keselamatan jenis yang dipertingkatkan kepada bahasa. Walau bagaimanapun, had tertentu timbul apabila menggunakan generik bersama-sama dengan membongkar data JSON.
Pertimbangkan senario yang melibatkan berbilang jenis laporan, setiap satunya dirangkumkan dalam ReportContainerImpl. Bekas termasuk parameter yang dikekang untuk melaksanakan antara muka Boleh dilaporkan, yang mewakili pelbagai jenis laporan. Walau bagaimanapun, unmarshaling memberikan cabaran kerana kekurangan sokongan Go untuk penegasan jenis pada struct dan penunjuk kepada jenis generik mentah.
Untuk menangani perkara ini, antara muka, ReportContainer, diperkenalkan, membenarkan ReportContainerImpl melaksanakannya. Walau bagaimanapun, kekangan jenis pada jenis pemulangan GetBody() tidak boleh dikuatkuasakan, membawa kepada keperluan untuk penegasan jenis semasa unmarshaling.
Teka-teki terletak pada fakta bahawa parameter jenis generik mesti diketahui semasa penyusunan, manakala JSON unmarshaling berlaku pada masa jalan dengan data dinamik.
Mengatasi Cabaran
Penyelesaian yang paling berdaya maju adalah dengan meninggalkan polimorfisme parametrik untuk kes penggunaan khusus ini. Adalah disyorkan untuk mengekalkan pendekatan json.RawMessage sedia ada, data dinamik unmarshal bersyarat dalam pernyataan suis dan mengembalikan struktur konkrit yang melaksanakan antara muka ReportContainer.
Penyelesaian Alternatif: Fungsi Unmarshal Generik
Dalam senario di mana parameter jenis boleh diketahui pada masa penyusunan, fungsi unmarshaling generik boleh digunakan, seperti berikut:
<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 ini menunjukkan konsep unmarshaling generik, perlu diingatkan bahawa json.Unmarshal Go sudah menyokong unmarshaling ke dalam mana-mana jenis. Oleh itu, fungsi generik tersuai hanya menambah kerumitan tanpa memberikan nilai tambahan.
Kesimpulannya, apabila berurusan dengan data JSON dinamik dan unmarshaling dalam Go, adalah dinasihatkan untuk mengutamakan keselamatan jenis melalui penggunaan antara muka yang sesuai dan penegasan jenis berbanding polimorfisme parametrik.
Atas ialah kandungan terperinci Bolehkah Generik Digunakan untuk JSON Unmarshaling dalam Go 1.18?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!