Maison > développement back-end > Golang > Pourquoi `copy()` renvoie-t-il une tranche vide lors de la copie vers une tranche de destination vide dans Go ?

Pourquoi `copy()` renvoie-t-il une tranche vide lors de la copie vers une tranche de destination vide dans Go ?

Mary-Kate Olsen
Libérer: 2024-12-16 09:14:14
original
736 Les gens l'ont consulté

Why Does `copy()` Return an Empty Slice When Copying to an Empty Destination Slice in Go?

Pourquoi copier une tranche vide avec copy() entraîne une tranche vide

Lorsque vous travaillez avec des tranches dans Go, la fonction copy() est souvent utilisé pour créer une copie d’une tranche existante. Cependant, si la tranche de destination est vide, l'opération de copie se comporte de manière inattendue.

Selon la documentation de copy() :

The copy built-in function copies elements from a source slice into a destination slice. (As a special case, it also will copy bytes from a string to a slice of bytes.) The source and destination may overlap. Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst).
Copier après la connexion

Cela suggère que le nombre d'éléments copiés doit être le minimum des longueurs des tranches source et destination. Cependant, lorsque la tranche de destination est vide (comme dans votre exemple où tmp est initialisé comme une tranche vide), aucun élément n'est copié.

La raison de ce comportement réside dans l'implémentation de copy(). La fonction parcourt la tranche source et copie les éléments dans la tranche de destination jusqu'à ce qu'elle atteigne la fin de la tranche source ou de la tranche de destination. Si la tranche de destination est vide, la boucle se terminera immédiatement puisqu'il n'y a aucun élément à copier.

Pour créer une copie non vide d'une tranche, la tranche de destination doit être initialisée avec une longueur non nulle. Ceci peut être réalisé en utilisant la fonction make(), comme le montre l'exemple suivant :

arr := []int{1, 2, 3}
tmp := make([]int, len(arr))
copy(tmp, arr)

fmt.Println(tmp) // Output: [1 2 3]
Copier après la connexion

En définissant explicitement la longueur de la tranche de destination, nous nous assurons que copy() dispose de suffisamment d'espace pour copier tous les éléments de la tranche source. Ce comportement est également documenté dans la spécification du langage Go, qui indique que le nombre d'éléments copiés est le minimum des longueurs des tranches source et de destination.

Par conséquent, lorsque vous tentez de copier une tranche vide à l'aide de copy( ), il est important d'initialiser la tranche de destination avec une longueur non nulle pour garantir la réussite de l'opération de copie.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal