Table des matières
Contenu de la question
Solution
Maison développement back-end Golang Déterminer si le champ de type d'interface de struct est défini

Déterminer si le champ de type d'interface de struct est défini

Feb 09, 2024 pm 06:27 PM
go语言

Déterminer si le champ de type dinterface de struct est défini

L'éditeur PHP Xiaoxin est là pour partager une astuce pour déterminer si le champ de type d'interface de struct est défini. Dans le langage Go, le type struct peut implémenter plusieurs interfaces. En déterminant si le champ type d'interface est défini, nous pouvons facilement déterminer si une structure implémente une interface spécifique. Cette technique est très pratique. Elle permet de déterminer avec précision le type d’objet dans le code et de le gérer en conséquence. Examinons ensuite la méthode de mise en œuvre spécifique !

Contenu de la question

Étant donné une structure dont les champs appartiennent au type d'interface :

type a interface { foo() }
type b interface { bar() }

type container struct {
   fielda a
   fieldb b
   ...
}
Copier après la connexion

Et les structures qui mettent en œuvre ces interfaces :

type a struct {}
func (*a) foo() {}
func newa() *a { return &a{} }

type b struct {}
func (*b) bar() {}
func newb() *b { return &b{} }
Copier après la connexion

Et le code qui crée l'instance container sans définir explicitement tous les champs :

c := &container{}
c.fielda = newa()
// c.fieldb = newb()  // <-- fieldb not explicitly set
Copier après la connexion

À l'aide de la réflexion, comment puis-je détecter un champ qui n'est pas défini explicitement ?

Vérifiez la valeur de fieldb au moment de l'exécution, vscode rapporte volontiers la valeur comme nil. De même, essayer d'appeler c.fieldb.bar() paniquera en raison d'un déréférencement de pointeur nul. Mais la réflexion ne vous permet pas de tester isnil, et iszero ne renvoie pas non plus vrai :

func validateContainer(c *container) {
    tC := reflect.TypeOf(*c)
    for i := 0; i < tC.NumField(); i++ {
        reflect.ValueOf(tC.Field(i)).IsNil() // panics
        reflect.ValueOf(tC.Field(i)).IsZero() // always false
        reflect.ValueOf(tC.Field(i)).IsValid() // always true
    }
}
Copier après la connexion

Solution

Tu devrais vérifier reflect.valueof(*c) 的字段,而不是 reflect.typeof(*c).

package main

import (
    "fmt"
    "reflect"
)

func validatecontainer(c *container) {
    tc := reflect.typeof(*c)
    vc := reflect.valueof(*c)
    for i := 0; i < vc.numfield(); i++ {
        if f := vc.field(i); f.kind() == reflect.interface {
            fmt.printf("%v: isnil: %v, iszero: %v, isvalid: %v\n",
                tc.field(i).name,
                f.isnil(),
                f.iszero(),
                f.isvalid(),
            )
        }
    }

    // tc.field(i) returns a reflect.structfield that describes the field.
    // it's not the field itself.
    fmt.printf("%#v\n", reflect.valueof(tc.field(0)))
}

type a interface{ foo() }
type b interface{ bar() }

type container struct {
    fielda a
    fieldb b
}

type a struct{}

func (*a) foo() {}
func newa() *a  { return &a{} }

func main() {
    c := &container{}
    c.fielda = newa()
    validatecontainer(c)
}
Copier après la connexion

Sortie :

FieldA: IsNil: false, isZero: false, IsValid: true
FieldB: IsNil: true, isZero: true, IsValid: true
reflect.StructField{Name:"FieldA", PkgPath:"", Type:(*reflect.rtype)(0x48de20), Tag:"", Offset:0x0, Index:[]int{0}, Anonymous:false}
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!

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

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser la réflexion pour accéder aux champs et méthodes privés dans Golang Comment utiliser la réflexion pour accéder aux champs et méthodes privés dans Golang May 03, 2024 pm 12:15 PM

Comment utiliser la réflexion pour accéder aux champs et méthodes privés dans Golang

Conseils pour créer dynamiquement de nouvelles fonctions dans les fonctions Golang Conseils pour créer dynamiquement de nouvelles fonctions dans les fonctions Golang Apr 25, 2024 pm 02:39 PM

Conseils pour créer dynamiquement de nouvelles fonctions dans les fonctions Golang

La différence entre les tests de performances et les tests unitaires en langage Go La différence entre les tests de performances et les tests unitaires en langage Go May 08, 2024 pm 03:09 PM

La différence entre les tests de performances et les tests unitaires en langage Go

À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? May 07, 2024 pm 12:39 PM

À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ?

Bibliothèques technologiques Golang et outils utilisés dans l'apprentissage automatique Bibliothèques technologiques Golang et outils utilisés dans l'apprentissage automatique May 08, 2024 pm 09:42 PM

Bibliothèques technologiques Golang et outils utilisés dans l'apprentissage automatique

L'évolution de la convention de dénomination des fonctions Golang L'évolution de la convention de dénomination des fonctions Golang May 01, 2024 pm 03:24 PM

L'évolution de la convention de dénomination des fonctions Golang

Le rôle de la technologie Golang dans le développement de l'IoT mobile Le rôle de la technologie Golang dans le développement de l'IoT mobile May 09, 2024 pm 03:51 PM

Le rôle de la technologie Golang dans le développement de l'IoT mobile

Les paramètres de variables Golang peuvent-ils être utilisés pour les valeurs de retour de fonction ? Les paramètres de variables Golang peuvent-ils être utilisés pour les valeurs de retour de fonction ? Apr 29, 2024 am 11:33 AM

Les paramètres de variables Golang peuvent-ils être utilisés pour les valeurs de retour de fonction ?

See all articles