


Bagaimana untuk Meratakan Medan Antara Muka Tanpa Nama dalam Pensirian Go JSON?
Meratakan Struktur JSON dengan Ahli Tanpa Nama dalam Go
Dalam Go, medan struct tanpa nama lazimnya disusun seolah-olah medan yang dieksport dalamannya ialah medan dalam struct luar. Walau bagaimanapun, ini boleh membawa kepada tingkah laku yang tidak dijangka apabila menyusun struct dengan ahli tanpa nama jenis antara muka{}.
Masalahnya
Pertimbangkan contoh berikut:
<code class="go">type User struct { Id int `json:"id"` Name string `json:"name"` } type Session struct { Id int `json:"id"` UserId int `json:"userId"` } type Anything interface{} type Hateoas struct { Anything Links map[string]string `json:"_links"` } func MarshalHateoas(subject interface{}) ([]byte, error) { h := &Hateoas{subject, make(map[string]string)} switch s := subject.(type) { case *User: h.Links["self"] = fmt.Sprintf("http://user/%d", s.Id) case *Session: h.Links["self"] = fmt.Sprintf("http://session/%d", s.Id) } return json.MarshalIndent(h, "", " ") } func main() { u := &User{123, "James Dean"} s := &Session{456, 123} json, err := MarshalHateoas(u) if err != nil { panic(err) } else { fmt.Println("User JSON:") fmt.Println(string(json)) } json, err = MarshalHateoas(s) if err != nil { panic(err) } else { fmt.Println("Session JSON:") fmt.Println(string(json)) } }</code>
Apabila berjalan kod ini, JSON yang terhasil tidak seperti yang dijangkakan:
<code class="json">User JSON: { "Anything": { "id": 123, "name": "James Dean" }, "_links": { "self": "http://user/123" } } Session JSON: { "Anything": { "id": 456, "userId": 123 }, "_links": { "self": "http://session/456" } }</code>
Seperti yang anda lihat, ahli tanpa nama Anything dianggap sebagai medan bernama dalam JSON, yang bukan tingkah laku yang dimaksudkan.
Penyelesaian
Untuk meratakan ahli tanpa nama dan mencapai struktur JSON yang diingini, kita boleh menggunakan pakej reflect untuk menggelungkan medan struct dan memetakannya ke peta[rentetan]antara muka{}. Ini membolehkan kami mengekalkan struktur rata bagi struktur asal tanpa memperkenalkan medan baharu.
Kod yang dikemas kini adalah seperti berikut:
<code class="go">import ( "encoding/json" "fmt" "reflect" ) // ... (rest of the code remains the same) func MarshalHateoas(subject interface{}) ([]byte, error) { links := make(map[string]string) out := make(map[string]interface{}) subjectValue := reflect.Indirect(reflect.ValueOf(subject)) subjectType := subjectValue.Type() for i := 0; i <p>Dengan pengubahsuaian ini, JSON yang terhasil diratakan dengan betul: </p> <pre class="brush:php;toolbar:false"><code class="json">User JSON: { "id": 123, "name": "James Dean", "_links": { "self": "http://user/123" } } Session JSON: { "id": 456, "userId": 123, "_links": { "self": "http://session/456" } }</code>
Atas ialah kandungan terperinci Bagaimana untuk Meratakan Medan Antara Muka Tanpa Nama dalam Pensirian Go JSON?. 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

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

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

Dreamweaver Mac版
Alat pembangunan web visual

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)
