Résoudre les limites de la covariance tableau/tranche dans Go : une approche ingénieuse
Le manque de covariance tableau/tranche de Go peut poser des défis lorsqu'il s'agit de données hétérogènes collections. Considérez la situation suivante :
func printItems(header string, items []interface{}, fmtString string) { // ... } func main() { var iarr = []int{1, 2, 3} var farr = []float{1.0, 2.0, 3.0} printItems("Integer array:", iarr, "") printItems("Float array:", farr, "") }
Malheureusement, ce code échouera avec des erreurs de compilation en raison du système de typage strict de Go :
prog.go:26: cannot use iarr (type []int) as type []interface { } in function argument prog.go:27: cannot use farr (type []float) as type []interface { } in function argument
Une solution sophistiquée : adopter les interfaces
Une façon élégante de surmonter cette limitation consiste à tirer parti du puissant système d'interface de Go. En définissant une interface qui encapsule les propriétés essentielles d'une collection de type tableau, nous pouvons créer une solution générique :
type List interface { At(i int) interface{} Len() int } func printItems(header string, items List) { for i := 0; i < items.Len(); i++ { fmt.Print(items.At(i), " ") } fmt.Println() }
Implémentations spécifiques au type
Pour chaque de type concret, nous implémentons l'interface List :
type IntList []int type FloatList []float64 func (il IntList) At(i int) interface{} { return il[i] } func (fl FloatList) At(i int) interface{} { return fl[i] } func (il IntList) Len() int { return len(il) } func (fl FloatList) Len() int { return len(fl) }
Exemple Utilisation
Pour utiliser notre code générique, nous encapsulons les tableaux concrets dans nos types personnalisés :
func main() { var iarr = []int{1, 2, 3} var farr = []float64{1.0, 2.0, 3.0} printItems("Integer array:", IntList(iarr)) printItems("Float array:", FloatList(farr)) }
Cette approche nous permet de manipuler des collections hétérogènes de manière générique, en contournant élégamment Go manque de covariance tableau/tranche tout en adhérant à ses principes de sécurité de type idiomatique.
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!