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

Comment restreindre l'interface{} à un type spécifique

WBOY
Libérer: 2024-02-05 22:57:04
avant
575 Les gens l'ont consulté

Comment restreindre linterface{} à un type spécifique

Contenu de la question

J'utilise go et j'ai une fonction d'usine qui renvoie différents types d'objets en fonction de l'identifiant demandé :

func newobject(id string) interface{} {
    switch id {
    case "truck":
        return truck{}
    case "car":
        return car{}
    ....
    }
}
Copier après la connexion

Voici les types de structures respectifs :

type Truck struct {
    Foo string
}

type Car struct {
    Bar string
}
Copier après la connexion

Comme vous pouvez le constater, les camions et les voitures n'ont rien en commun. Le problème se pose car j'appelle maintenant newobject(..) 时必须处理过于宽泛的类型 interface{} . Je sais qu'il existe des génériques, mais cela nécessite de conserver une liste de tous les types pris en charge dans une contrainte de type, ce qui complique les choses dans ma base de code.

En gros, je cherche un moyen d'utiliser l'héritage ici, ce que go ne prend bien sûr pas en charge. Quelle est l'alternative ?


Bonne réponse


newobject(..) Les fonctions peuvent être implémentées avec le support de génériques. Vous n'avez pas besoin de conserver une liste de tous les types pris en charge dans une contrainte de type.

func NewObject[T any](id string) T {
 var vehicle any

 switch id {

 case "truck":
  vehicle = Truck{
   Foo: "foo",
  }
 case "car":
  vehicle = Car{
   Bar: "bar",
  }
 }

 if val, ok := vehicle.(T); ok {
  return val
 }

 var otherVehicle T
 fmt.Printf("Not implemented. Returning with default values for \"%v\"\n", id)
 return otherVehicle
}

Copier après la connexion

Vous pouvez voir l'exemple complet ici.

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!

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