Maison >développement back-end >Golang >Comment puis-je stocker à la fois des valeurs de chaîne et des valeurs entières dans un champ de structure dans Go ?

Comment puis-je stocker à la fois des valeurs de chaîne et des valeurs entières dans un champ de structure dans Go ?

DDD
DDDoriginal
2024-11-28 00:14:11882parcourir

How can I store both string and integer values in a struct field in Go?

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!

Déclaration:
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