Heim >Backend-Entwicklung >Golang >So lesen Sie den Schnittstellenwert mit der Strukturadresse

So lesen Sie den Schnittstellenwert mit der Strukturadresse

WBOY
WBOYnach vorne
2024-02-10 19:21:08772Durchsuche

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

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)
}

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
}

Die Ausgabe ist:

main.DBBatch
map[string]interface {}
*main.DBBatch
*main.DBBatch

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen