En Golang, l'interface et la structure sont deux types de données courants. Une interface est un type abstrait qui définit un ensemble de méthodes sans implémentation, tandis qu'une structure est un type concret utilisé pour organiser et stocker des données. Dans le développement réel, nous devrons peut-être convertir l'interface en structure. Cet article présentera deux méthodes pour convertir les interfaces en structures dans Golang.
1. Utilisez la réflexion pour convertir l'interface en structure
En golang, vous pouvez utiliser la réflexion pour terminer l'opération de conversion de l'interface en structure. La réflexion est un mécanisme puissant capable de lire et de modifier dynamiquement des informations telles que la valeur, le type et les attributs d'une variable au moment de l'exécution. En réflexion, ceux couramment utilisés incluent Reflect.Value et Reflect.Type.
Les étapes spécifiques de mise en œuvre sont les suivantes :
type Person struct { Name string Age int }
type PersonInterface interface { GetName() string GetAge() int }
func ConvertInterfaceToStruct(p PersonInterface) (Person, error) { var person Person value := reflect.ValueOf(p) if value.Kind() == reflect.Ptr && !value.IsNil() { value = value.Elem() if value.Kind() == reflect.Struct { person.Name = value.FieldByName("Name").String() person.Age = int(value.FieldByName("Age").Int()) return person, nil } } return person, fmt.Errorf("invalid type:%v", reflect.TypeOf(p)) }
Dans cette fonction, convertissez d'abord le type d'interface en une valeur de réflexion (reflect.Value), puis déterminez si la valeur est un type de pointeur et non nulle. Ensuite, le type de pointeur est converti en type de structure, puis les valeurs des champs Nom et Âge sont obtenues par réflexion, et enfin le type de structure Personne est renvoyé.
func main() { p := &Person{Name: "Tom", Age: 20} fmt.Println(p) if ps, err := ConvertInterfaceToStruct(p); err != nil { log.Fatal(err) } else { fmt.Println(ps) } }
Dans ce code de test, créez un pointeur de structure Personne et utilisez la fonction ConvertInterfaceToStruct implémentée pour convertir le type de pointeur en type de structure Personne et afficher le résultat.
2. Utilisez json pour implémenter l'interface et la convertir en structure
Dans Golang, json est un format de données courant, et un objet peut être sérialisé en structure via json.Marshal() chaîne json, vous pouvez également désérialiser une chaîne json en un objet via json.Unmarshal().
Les étapes spécifiques de mise en œuvre sont les suivantes :
type Person struct { Name string `json:"name,omitempty"` Age int `json:"age,omitempty"` }
Dans cette structure, le nom du champ json est spécifié pour correspondre à son nom de champ dans l'interface afin de réaliser la conversion.
type PersonInterface interface { GetName() string GetAge() int }
func ConvertInterfaceToStruct(p PersonInterface) (Person, error) { jsonStr, err := json.Marshal(p) if err != nil { return Person{}, err } var person Person err = json.Unmarshal(jsonStr, &person) if err != nil { return Person{}, err } return person, nil }
Dans cette fonction, utilisez d'abord json.Marshal() pour convertir le type d'interface en chaîne json, puis utilisez json.Unmarshal() pour le convertir en Type de structure Personne et renvoie la structure.
func main() { p := &Person{Name: "Tom", Age: 20} fmt.Println(p) if ps, err := ConvertInterfaceToStruct(p); err != nil { log.Fatal(err) } else { fmt.Println(ps) } }
Dans ce code de test, créez un pointeur de structure Personne et utilisez la fonction ConvertInterfaceToStruct implémentée pour convertir le type de pointeur en type de structure Personne et afficher le résultat.
Résumé :
Les deux méthodes ci-dessus peuvent convertir le type d'interface en type de structure, en utilisant différentes manières de l'implémenter. La mise en œuvre de la méthode de réflexion est relativement faible. -level. Le jugement de type et la lecture par réflexion de champ sont requis, mais la méthode json est relativement simple et claire. Il vous suffit d'utiliser les méthodes de sérialisation et de désérialisation json dans golang. Le choix des différentes méthodes dépend de facteurs tels que les besoins réels et les performances.
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!