Maison  >  Article  >  développement back-end  >  Comment lire la valeur de l'interface avec l'adresse de la structure

Comment lire la valeur de l'interface avec l'adresse de la structure

WBOY
WBOYavant
2024-02-10 19:21:08734parcourir

Comment lire la valeur de linterface avec ladresse de la structure

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!

Contenu de la question

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 ?

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer