Quand est-ce que append() dans Go crée une nouvelle tranche ?
Contexte :
La fonction Go append() est utilisée pour ajouter un ou plusieurs éléments à une tranche, et elle est documentée pour créer une nouvelle tranche lorsque la capacité de la tranche d'origine est insuffisante. Cependant, une enquête sur un algorithme récursif qui ajoute des éléments à une tranche a montré que les tranches envoyées sur un canal semblent être modifiées après leur envoi.
Confusion :
Cette observation contredit la documentation, qui indique que append() devrait renvoyer une nouvelle tranche. Cette confusion survient parce que la documentation append() fait référence au type de données slice, alors que l'implémentation réelle fonctionne avec des descripteurs de tranche.
Résolution :
Un descripteur de tranche se compose de trois composants : une longueur, une capacité et un pointeur vers les données sous-jacentes. Lorsque append() est appelé, il renvoie un nouveau descripteur de tranche avec une longueur et une capacité mises à jour. Cependant, le pointeur vers les données sous-jacentes reste le même.
Explication :
Par conséquent, même si append() renvoie un nouveau descripteur de tranche, les données réelles sont toujours partagé entre les anciennes et les nouvelles tranches. En effet, les données sous-jacentes sont stockées dans un emplacement mémoire distinct pointé par le descripteur de tranche.
Exemple :
Le code suivant illustre ce comportement :
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) s = append(s, []int{1, 2, 3, 4}...) a := append(s, 5) fmt.Println(a) b := append(s, 6) fmt.Println(b) fmt.Println(a) }</code>
Le résultat montre que les deux tranches modifiées, a et b, partagent les mêmes données sous-jacentes que les tranches d'origine, même si elles ont une longueur et une capacité différentes.
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!