Heim >Backend-Entwicklung >Golang >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!
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?
. 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!