Conversion de type et interfaces dans les champs Struct
Question :
Dans un programme Go, une structure est utilisée pour définir un type de données défini par l'utilisateur qui regroupe plusieurs champs de types différents. Cependant, que se passe-t-il si vous souhaitez un champ dans une structure pouvant stocker à la fois des valeurs de chaîne et des valeurs entières ?
Réponse :
Le système de types de Go ne prend pas en charge les types de somme, ce qui permettre à un seul champ de stocker des valeurs de plusieurs types. Il existe cependant une solution de contournement utilisant les interfaces. Une interface définit un ensemble de méthodes, et tout type qui implémente ces méthodes peut être utilisé comme interface.
Pour implémenter cette solution, considérez l'extrait suivant :
type Input interface { ToString() string ToInteger() int } type TestCase struct { Input Input IsValid bool }
Dans cet exemple , nous avons défini l'interface d'entrée avec deux méthodes, ToString() et ToInteger(), qui sont utilisées pour convertir la valeur d'entrée en chaîne ou en entier. La structure TestCase dispose désormais d'un champ de saisie qui accepte tout type implémentant l'interface de saisie.
Pour utiliser cette solution, vous pouvez définir des types personnalisés qui implémentent l'interface de saisie :
type StringInput string func (s StringInput) ToString() string { return string(s) } func (s StringInput) ToInteger() int { return 0 // Error handling omitted for brevity } type IntegerInput int func (i IntegerInput) ToString() string { return strconv.Itoa(int(i)) } func (i IntegerInput) ToInteger() int { return int(i) }
Avec ces types personnalisés, vous pouvez créer un TestCase et attribuer des valeurs au champ de saisie :
var testCase = TestCase{Input: StringInput("Hello"), IsValid: true} fmt.Println(testCase.Input.ToString()) // Prints "Hello" fmt.Println(testCase.Input.ToInteger()) // Throws error
Bien que cette approche vous permette de stocker à la fois une chaîne et un entier valeurs dans le même champ, cela nécessite la mise en œuvre de types personnalisés et de méthodes de conversion, qui peuvent ne pas convenir à tous les cas.
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!