En langage Go, l'interface est un type très puissant et flexible. Cependant, nous pouvons rencontrer une certaine confusion en essayant de lire l'adresse de la structure dans une valeur d'interface. Alors, comment lire une valeur d’interface qui a une adresse de structure ? Dans cet article, nous répondrons à cette question pour vous et vous fournirons quelques conseils pratiques et des exemples de code. Que vous soyez débutant ou développeur Go expérimenté, cet article vous aidera. Nous allons jeter un coup d'oeil!
J'ai une variable avec un type de données interface{}
et je lui passe l'adresse d'une structure. Maintenant, je n'arrive plus à lire les champs depuis l'interface
Le code est le suivant :
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
Si j'utilise res.data.username
j'obtiens une erreur
Comment lire les champs de structure depuis l'interface ?
Comparez cela avec golang Pourquoi les champs qui n'existent pas dans les structures go existent-ils toujours après le rassemblement de ladite structure en json. Au début, je pensais que c'était les mêmes. Mais il s’est avéré que ce n’était pas le cas.
Pour cette question, une valeur de type res.data
拥有 *userdata
. Une simple assertion de type fera donc l’affaire.
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) }
La démo suivante est une fusion de deux démos de @mkopriva qui montre la différence :
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 }
Le résultat est :
main.DBBatch map[string]interface {} *main.DBBatch *main.DBBatch
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!