So lesen Sie den Schnittstellenwert mit der Strukturadresse

WBOY
Freigeben: 2024-02-10 19:21:08
nach vorne
733 Leute haben es durchsucht

So lesen Sie den Schnittstellenwert mit der Strukturadresse

In der Go-Sprache ist die Schnittstelle ein sehr leistungsfähiger und flexibler Typ. Beim Versuch, die Strukturadresse in einem Schnittstellenwert zu lesen, kann es jedoch zu Verwirrung kommen. Wie liest man also einen Schnittstellenwert, der eine Strukturadresse hat? In diesem Artikel beantworten wir diese Frage für Sie und geben einige praktische Tipps und Beispielcode. Egal, ob Sie Anfänger oder erfahrener Go-Entwickler sind, dieser Artikel wird Ihnen helfen. Lass uns einen Blick darauf werfen!

Frageinhalt

Ich habe eine Variable mit Datentyp interface{} und übergebe ihr die Adresse einer Struktur. Jetzt kann ich die Felder nicht mehr aus der Schnittstelle lesen

Der Code lautet wie folgt:

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
Nach dem Login kopieren

Wenn ich res.data.username verwende, erhalte ich eine Fehlermeldung

Wie lese ich Strukturfelder aus der Schnittstelle?

Problemumgehung

Vergleichen Sie dies mit golang. Warum existieren Felder, die in Go-Strukturen nicht vorhanden sind, immer noch, nachdem diese Struktur an JSON gemarshallt wurde? Zuerst dachte ich, sie wären gleich. Es stellte sich jedoch heraus, dass dies nicht der Fall war.

Für diese Frage ein Wert vom Typ

. Eine einfache Typzusicherung reicht also aus. res.data 拥有 *userdata

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)
}
Nach dem Login kopieren

Die folgende Demo ist eine Zusammenführung zweier Demos von @mkopriva, die den Unterschied zeigt:

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
}
Nach dem Login kopieren

Die Ausgabe ist:

main.DBBatch
map[string]interface {}
*main.DBBatch
*main.DBBatch
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo lesen Sie den Schnittstellenwert mit der Strukturadresse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!