J'ai besoin de faire une copie d'une tranche dans Go et en lisant la documentation, une fonction de copie est à ma disposition.
La fonction intégrée de copie copie les éléments d'une tranche source dans une tranche de destination. (Dans un cas particulier, il copiera également les octets d'une chaîne vers une tranche d'octets.) La source et la destination peuvent se chevaucher. Copy renvoie le nombre d'éléments copiés, qui sera le minimum de len (src) et len (dst).
Mais quand je fais:
arr := []int{1, 2, 3}
tmp := []int{}
copy(tmp, arr)
fmt.Println(tmp)
fmt.Println(arr)
My tmp
est vide comme avant (j'ai même essayé de l'utiliser arr, tmp
):
[]
[1 2 3]
Vous pouvez le vérifier sur le terrain de jeu . Alors pourquoi ne puis-je pas copier une tranche?
dst
devrait être au moins aussi grande que le nombre d'éléments que vous souhaitez copier (pour une copie complète desrc
cela signifielen(dst) >= len(src)
).b := append([]int{}, a...)
Réponses:
Les BUILTIN
copy(dst, src)
copies desmin(len(dst), len(src))
éléments.Donc, si votre
dst
est vide (len(dst) == 0
), rien ne sera copié.Essayez
tmp := make([]int, len(arr))
( Go Playground ):Sortie (comme prévu):
Malheureusement, cela n'est pas documenté dans le
builtin
package, mais il est documenté dans la spécification du langage Go: Ajout et copie de tranches :Éditer:
Enfin, la documentation de
copy()
a été mise à jour et contient désormais le fait que la longueur minimale de la source et de la destination sera copiée:la source
copy
ne contient pas de logique pour augmenter la tranche de destination si la tranche de destination est trop petite, mais il existe une autre fonction intégrée qui le fait: alorsappend
que dans cet exemple, il est préférable d'allouer la tranche de bonne taille en premier lieu,append
peut être utilisé lorsque vous avez déjà une tranche et que vous souhaitez l'agrandir en ajoutant des éléments à la fin.Un autre moyen simple de le faire est d'utiliser
append
qui attribuera la tranche dans le processus.Sortie (comme prévu):
Donc, un raccourci pour copier un tableau
arr
seraitappend([]int(nil), arr...)
https://play.golang.org/p/sr_4ofs5GW
la source
Si vos tranches étaient de la même taille, cela fonctionnerait :
Donnerait:
À partir de " Go Slices: utilisation et éléments internes ":
L'exemple habituel est:
la source
Le copy () s'exécute sur la plus petite longueur de dst et src, vous devez donc initialiser le dst à la longueur souhaitée.
Production:
Vous pouvez initialiser et copier tous les éléments sur une seule ligne en utilisant append () sur une tranche nil.
Exemple:
Production:
En comparaison avec allocation + copy (), pour plus de 1 000 éléments, utilisez append. En fait, en dessous de 1000, la différence peut être négligée, faites-en une règle empirique à moins que vous n'ayez plusieurs tranches.
la source
tmp
a besoin de suffisamment de place pourarr
. Par exemple,Production:
la source
Voici un moyen de copier une tranche. Je suis un peu en retard, mais il y a une réponse plus simple et plus rapide que celle de @ Dave. Ce sont les instructions générées à partir d'un code comme celui de @ Dave. Ce sont les instructions générées par le mien. Comme vous pouvez le voir, il y a beaucoup moins d'instructions. Ce qu'il fait, c'est qu'il fait juste
append(slice)
, qui copie la tranche. Ce code:Sort ceci:
la source