Maison > développement back-end > Golang > le corps du texte

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

WBOY
Libérer: 2024-02-10 19:21:08
avant
767 Les gens l'ont consulté

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
Copier après la connexion

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)
}
Copier après la connexion

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
}
Copier après la connexion

Le résultat est :

main.DBBatch
map[string]interface {}
*main.DBBatch
*main.DBBatch
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal