Conversion de tranches en tableaux de taille fixe dans Go
Un scénario courant dans Go est la nécessité de convertir une tranche en un tableau de taille fixe. Bien que cela puisse paraître simple, cela peut entraîner une erreur de compilation. Pour comprendre cette erreur et sa solution, analysons l'extrait de code suivant :
func gen(bricks []Brick) { if len(bricks) == 16 { if check(Sculpture{bricks}) { var b [16]Brick = bricks[0:16]; // This line generates the error } } }
Le message d'erreur indique que l'objet slice ne peut pas être directement affecté à un tableau de taille fixe. En effet, Go traite les tranches et les tableaux comme des types distincts.
Solution : à l'aide de la fonction « copier »
Pour convertir une tranche en un tableau de taille fixe, vous pouvez utilisez la fonction « copie » intégrée. Cette fonction prend deux tranches en entrée et copie un nombre spécifié d'éléments de la tranche source vers la tranche de destination. En fournissant les entrées correctes, vous pouvez transférer efficacement les éléments de la tranche dans le tableau de taille fixe.
Voici un exemple illustrant l'utilisation de « copie » :
slice := []byte("abcdefgh") var arr [4]byte copy(arr[:], slice[:4]) fmt.Println(arr) // Output: [97 98 99 100]
Dans ce cas , 'copy' transfère les quatre premiers éléments de la tranche dans le tableau 'arr'.
Syntaxe alternative
Une autre façon concise d'obtenir le même résultat en utilisant 'copy ' consiste à omettre les indices de tranche :
copy(arr[:], slice)
La fonction 'copier' copiera automatiquement le nombre minimum d'éléments que les deux tranches peuvent accueillir. Par conséquent, vous pouvez ignorer la spécification des indices lorsque les tailles correspondent ou lorsque vous souhaitez remplir l'intégralité du tableau de taille fixe.
Go 1.17 et supérieur
Il convient de noter que Go 1.17 a introduit la prise en charge des conversions de tranche en tableau. Cette fonctionnalité permet d'attribuer directement une tranche à un pointeur de tableau du même type de base :
s := make([]byte, 2, 4) s0 := (*[0]byte)(s) // s0 != nil s1 := (*[1]byte)(s[1:]) // &s1[0] == &s[1] s2 := (*[2]byte)(s) // &s2[0] == &s[0]
Cependant, cette fonctionnalité est toujours considérée comme expérimentale et peut ne pas être disponible dans tous les environnements.
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!