Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara membaca nilai antara muka dengan alamat struktur

Cara membaca nilai antara muka dengan alamat struktur

WBOY
WBOYke hadapan
2024-02-10 19:21:08770semak imbas

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!

Kandungan soalan

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?

Penyelesaian

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam