Mon but est d'enlever un élément de tranche spécifique, et le code est quelque chose comme:Pourquoi est-il impossible de modifier la longueur ou la capacité d'une tranche via un appel de fonction?
func main() {
s := []int{0, 1, 2, 3, 4}
remove(s, 3)
fmt.Println(s, len(s), cap(s))
}
func remove(s []int, idx int) {
if idx < 0 || idx >= len(s) {
return
}
copy(s[idx:], s[idx+1:])
s = s[:len(s)-1]
fmt.Println(s, len(s), cap(s))
}
mais la sortie a montré:
[0 1 2 4] 4 5 [0 1 2 4 4] 5 5
Comme je sais, tranche sera passé à un appel de fonction comme type de référence, pourquoi n'est-il pas capable de le modifier?
Une tranche est ** ** pas un type de référence, pas vraiment. –
En outre, duplication possible de: [Golang ajouter un élément à une tranche] (https://stackoverflow.com/questions/20195296/golang-append-an-item-to-a-slice). –
Une tranche n'est pas un type de référence, mais [elle utilise un pointeur (ou quelque chose d'équivalent sur le plan fonctionnel) pour éviter de gaspiller de la mémoire] (https://play.golang.org/p/8CBxmyBJjl). Cela signifie que la mémoire est partagée entre les deux tranches, mais les longueurs et même les bouchons peuvent différer. Ils sont essentiellement deux éléments différents. Vous pouvez en savoir plus sur les tranches dans l'entrée de blog "Go Slices: usage and internal", en particulier [cette section] (https://blog.golang.org/go-slices-usage-and-internals#TOC_4.). –