2017-10-18 9 views
-1

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?

+5

Une tranche est ** ** pas un type de référence, pas vraiment. –

+1

En outre, duplication possible de: [Golang ajouter un élément à une tranche] (https://stackoverflow.com/questions/20195296/golang-append-an-item-to-a-slice). –

+0

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.). –

Répondre

5

tranche contient trois valeurs:

1) pointeur de réseau sous-jacent

2) de longueur

des capacités

3)

Quand on passe tranche à une fonction, vous faire passer un exemplaire de chacune de ces trois valeurs. Par conséquent, vous ne pouvez pas modifier la longueur et la capacité, mais puisque vous avez le pointeur vers le tableau sous-jacent, vous pouvez changer les valeurs dans le tableau.

2

La tranche n'est pas un type de pointeur. Sous la hotte, la tranche se compose de 3 valeurs: longueur, capacité et pointeur vers le tableau. Quand vous le passez en valeur, vous obtenez des copies de longueur et de capacité - vous pouvez les changer pour vous. Les modifications apportées au tableau seront visibles en dehors de la fonction.

Et si ces résultats

produit