Rumah > pembangunan bahagian belakang > Golang > Bolehkah Generik Digunakan untuk JSON Unmarshaling dalam Go 1.18?

Bolehkah Generik Digunakan untuk JSON Unmarshaling dalam Go 1.18?

Patricia Arquette
Lepaskan: 2024-10-30 22:22:03
asal
652 orang telah melayarinya

Can Generics Be Used for JSON Unmarshaling in Go 1.18?

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>
Salin selepas log masuk

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!

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