Maison > développement back-end > Golang > Comment pouvons-nous gérer efficacement les limitations de covariance tableau/tranche de Go ?

Comment pouvons-nous gérer efficacement les limitations de covariance tableau/tranche de Go ?

Barbara Streisand
Libérer: 2024-12-14 21:32:15
original
288 Les gens l'ont consulté

How Can We Efficiently Handle Go's Array/Slice Covariance Limitations?

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, "")
}
Copier après la connexion

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
Copier après la connexion

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()
}
Copier après la connexion

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) }
Copier après la connexion

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))
}
Copier après la connexion

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal