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{} .... } }
Voici les types de structures respectifs :
type Truck struct { Foo string } type Car struct { Bar string }
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 ?
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 }
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!