


Menyahmarshalling into Interface{} for Type Assertion in Golang
Dalam senario ini, rentetan JSON dihantar melalui RabbitMQ. Rentetan ini mewakili contoh dua struct berbeza, Somthing1 dan Somthing2. Matlamatnya adalah untuk menyahmarshal rentetan JSON kembali ke dalam struct masing-masing dan melakukan penegasan jenis.
Masalahnya
Pada pandangan pertama, nampaknya unmarshalling ke dalam antara muka{} dan kemudian menggunakan penegasan jenis sepatutnya memadai. Walau bagaimanapun, apabila dibongkar, pembolehubah input adalah daripada jenis peta[rentetan]antara muka{}. Ini tidak seperti yang dijangkakan dan percubaan untuk menghidupkan jenis ini atau menetapkannya semula kepada struct yang diingini gagal.
Penyelesaian
Pustaka JSON di Golang menyahmarshal menjadi jenis lalai seperti bool, float64 , dan peta[rentetan]antara muka{}. Untuk mendapatkan struct yang diingini, anda perlu menyahmarshal terus ke dalamnya atau menukar secara manual daripada peta[rentetan]antara muka{}.
Menggunakan Direct Unmarshal
Pendekatan pilihan adalah untuk menyahmarshal terus ke dalam structs:
func typeAssert(msg string) { var job Somthing1 json.Unmarshal([]byte(msg), &job) // ... var stats Somthing2 json.Unmarshal([]byte(msg), &stats) // ... }
Menggunakan Struktur Unpacker
Jika unmarshalling secara langsung tidak boleh dilaksanakan, anda boleh menggunakan struct Unpacker untuk mengendalikan unmarshalling dan menyediakan antara muka untuk mengakses data:
type Unpacker struct { Data interface{} } func (u *Unpacker) UnmarshalJSON(b []byte) error { // Attempt to unmarshal into both types smth1 := &Something1{} err := json.Unmarshal(b, smth1) if err == nil && smth1.Thing != "" { u.Data = smth1 return nil } smth2 := &Something2{} err = json.Unmarshal(b, smth2) if err != nil { return err } u.Data = smth2 return nil }
Kemudian, anda boleh menggunakan Unpacker untuk mengakses data unmarshalling:
func typeAssert(msg string) { unpacker := &Unpacker{} json.Unmarshal([]byte(msg), unpacker) switch v := unpacker.Data.(type) { case Something1: // ... case Something2: // ... default: // Handle unknown type } }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Penegasan Jenis dengan Cekap Selepas Menyahmarshall JSON ke dalam antara muka{} dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

GoisastrongChoiceForProjectSneedingsImplicity, Prestasi, dan Konconcurrency, ButitMayLackinAdvancedFeaturesandecosystemMatiur.1) Go'SsyntaxIssimpleAndeasyTolearn, LeadingTofeFeWerBugsandMoremaintainabeCode, walaupun

Go'sinitfunctionandJava'sstaticinitializersbothservetosetupenvironmentsbeforethemainfunction,buttheydifferinexecutionandcontrol.Go'sinitissimpleandautomatic,suitableforbasicsetupsbutcanleadtocomplexityifoverused.Java'sstaticinitializersoffermorecontr

Thecommonusecasesfortheinitfunctioningoare: 1) loadingconfigurationfilesbeforethemainprogramstarts, 2) inisialisasiglobalvariables, dan3) runnerpre-checksorvalidationsbeforetheprogramprogramproceShunticoThor

ChannelsarecrucialingoforenablingsafeandefficientCommunicationBetweengoroutines.theyfacilitatesynchronizationandmanageGoroutinelifeCycle, EssentifFonConcurrentProgramming.ChannelsallowsendingDreceivingValues, ActaSsignalsforsynchronization

Dalam GO, kesilapan boleh dibungkus dan konteks boleh ditambah melalui ralat.wrap dan ralat.Unwrap kaedah. 1) Menggunakan ciri baru pakej ralat, anda boleh menambah maklumat konteks semasa penyebaran ralat. 2) Bantu mencari masalah dengan membungkus ralat melalui fmt.errorf dan %w. 3) Jenis ralat tersuai boleh membuat lebih banyak kesilapan semantik dan meningkatkan keupayaan ekspresif pengendalian ralat.

GooffersrobustfeaturesforsecureCoding, butdevelopermustImplementsEcurityBestPracticeSefectively.1) usego'soGo'ScryptopackageForseCureTaTahAndling.2) ManageConcurrencyWithSynchronizationPrimitivestopreVentRaceCondition.3)

Antara muka ralat Go ditakrifkan sebagai TypeErrorInterface {error () String}, yang membolehkan mana -mana jenis yang melaksanakan kaedah ralat () untuk dianggap ralat. Langkah -langkah untuk digunakan adalah seperti berikut: 1. Pada dasarnya periksa dan kesilapan log, seperti iferr! = Nil {log.printf ("anErroroccurred:%v", err) kembali}. 2. Buat jenis ralat tersuai untuk memberikan lebih banyak maklumat, seperti TypeDerErrorstruct {MsgStringDetailString}. 3. Gunakan pembalut ralat (sejak GO1.13) untuk menambah konteks tanpa kehilangan mesej ralat asal,

ToeffectivelyHandleerrorsinconcurrentgoprograms, usechannelstocommunicateerrors, pelaksanarorwatchers, considertimeouts, usebufferedchannels, danprovideclearerrormessages.1) usechannelstopasserrorserrorserrorserrorserrorserrorserrorserrorserrorserrorserrorserrorserrorserrorserrorserrorserrorserrorserrorserrgoroutinestothemainfiunchtion.2) properestanrors


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Versi Mac WebStorm
Alat pembangunan JavaScript yang berguna

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

ZendStudio 13.5.1 Mac
Persekitaran pembangunan bersepadu PHP yang berkuasa

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

Dreamweaver CS6
Alat pembangunan web visual
