Rumah > Artikel > pembangunan bahagian belakang > Cara membaca nilai antara muka dengan alamat struktur
Dalam bahasa Go, antara muka ialah jenis yang sangat berkuasa dan fleksibel. Walau bagaimanapun, kami mungkin menghadapi beberapa kekeliruan apabila cuba membaca alamat struktur dalam nilai antara muka. Jadi, bagaimana anda membaca nilai antara muka yang mempunyai alamat struct? Dalam artikel ini, kami akan menjawab soalan ini untuk anda dan memberikan beberapa petua praktikal dan kod sampel. Sama ada anda seorang pemula atau pembangun Go yang berpengalaman, artikel ini akan membantu anda. Mari lihat!
Saya mempunyai pembolehubah dengan jenis data interface{}
dan hantar alamat struktur kepadanya. Sekarang saya tidak boleh membaca medan dari antara muka
Kod adalah seperti berikut:
type UserData struct { UserID string `json:"user_id"` UserName string `json:"user_name"` } type Result struct { Status string `json:"status"` Data interface{} `json:"data"` } var res Result res.Data = &UserData json.Unmarshal([]byte(`{"status": "success", "data": {"user_id":15,"user_name":"abc"}}`), &res) fmt.Println(res.Data) //working fine fmt.Println(res.Data.UserName) //getting error: type interface{} has no field or method UserName
Jika saya menggunakan res.data.username
saya mendapat ralat
Bagaimana untuk membaca medan struktur daripada antara muka?
Bandingkan ini dengan golang Mengapa medan yang tidak wujud dalam go struct masih wujud selepas marshalling struct tersebut kepada json. Pada mulanya saya fikir mereka adalah sama. Tetapi ternyata tidak begitu.
Untuk soalan ini, nilai jenis res.data
拥有 *userdata
. Jadi penegasan jenis mudah akan dilakukan.
package main import ( "encoding/json" "fmt" ) type userdata struct { userid string `json:"user_id"` username string `json:"user_name"` } type result struct { status string `json:"status"` data interface{} `json:"data"` } func main() { var res result res.data = &userdata{} json.unmarshal([]byte(`{"status": "success", "data": {"user_id":15,"user_name":"abc"}}`), &res) fmt.println(res.data) fmt.println(res.data.(*userdata).username) }
Demo berikut ialah gabungan dua demo oleh @mkopriva yang menunjukkan perbezaan:
package main import ( "encoding/json" "fmt" "log" ) type dbbatch struct { fieldtokeep string `json:"field_to_keep"` fieldtokeep2 string `json:"field_to_keep2"` } func main() { jsonbatch := `{"field_to_keep":"xxxxx","field_to_keep2":"26400527","field_to_delete":"whynotdeleted"}` var i interface{} = dbbatch{} fmt.printf("%t\n", i) // type is dbbatch if err := json.unmarshal([]byte(jsonbatch), &i); err != nil { log.println(err) } fmt.printf("%t\n", i) // type is not dbbatch anymore, instead it's map[string]any i = &dbbatch{} fmt.printf("%t\n", i) // type is *dbbatch if err := json.unmarshal([]byte(jsonbatch), &i); err != nil { log.println(err) } fmt.printf("%t\n", i) // type is *dbbatch }
Keluaran ialah:
main.DBBatch map[string]interface {} *main.DBBatch *main.DBBatch
Atas ialah kandungan terperinci Cara membaca nilai antara muka dengan alamat struktur. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!