Necesito hacer una copia de un segmento en Go y, al leer los documentos, tengo una función de copia a mi disposición.
La función de copia incorporada copia elementos de un segmento de origen en un segmento de destino. (Como caso especial, también copiará bytes de una cadena a un segmento de bytes). El origen y el destino pueden superponerse. Copiar devuelve el número de elementos copiados, que será el mínimo de len (src) y len (dst).
Pero cuando lo hago:
arr := []int{1, 2, 3}
tmp := []int{}
copy(tmp, arr)
fmt.Println(tmp)
fmt.Println(arr)
Mi tmp
está vacío como estaba antes (incluso intenté usarlo arr, tmp
):
[]
[1 2 3]
Puedes comprobarlo en el patio de juegos . Entonces, ¿por qué no puedo copiar una porción?
dst
debería ser al menos tan grande como muchos de los elementos que desea copiar (para una copia completasrc
que significalen(dst) >= len(src)
).b := append([]int{}, a...)
Respuestas:
Los elementos de
copy(dst, src)
copia incorporadosmin(len(dst), len(src))
.Entonces, si tu
dst
está vacío (len(dst) == 0
), no se copiará nada.Prueba
tmp := make([]int, len(arr))
( Ir al patio de recreo ):Salida (como se esperaba):
Desafortunadamente, esto no está documentado en el
builtin
paquete, pero está documentado en la Especificación de idioma de Go: Agregar y copiar porciones :Editar:
Finalmente
copy()
se ha actualizado la documentación de y ahora contiene el hecho de que se copiará la longitud mínima de origen y destino:fuente
copy
no contiene lógica para hacer crecer el segmento de destino si el segmento de destino es demasiado pequeño, pero hay otra función incorporada que sí lo hace:append
mientras que en este ejemplo es mejor asignar el segmento del tamaño correcto en primer lugar,append
se puede usar cuando ya tiene un segmento y desea aumentarlo agregando elementos al final.Otra forma sencilla de hacer esto es usando
append
which asignará el segmento en el proceso.Salida (como se esperaba):
Entonces, una forma abreviada de copiar matriz
arr
seríaappend([]int(nil), arr...)
https://play.golang.org/p/sr_4ofs5GW
fuente
Si sus rebanadas fueran del mismo tamaño, funcionaría :
Daría:
De " Go Slices: uso e internos ":
El ejemplo habitual es:
fuente
El copy () se ejecuta para la menor longitud de dst y src, por lo que debe inicializar el dst a la longitud deseada.
Salida:
Puede inicializar y copiar todos los elementos en una línea usando append () en un segmento nulo.
Ejemplo:
Salida:
En comparación con la asignación + copia (), para más de 1000 elementos, use append. En realidad, por debajo de 1,000, la diferencia puede pasarse por alto, conviértalo en una regla general a menos que tenga muchas rebanadas.
fuente
tmp
necesita suficiente espacio paraarr
. Por ejemplo,Salida:
fuente
A continuación, se muestra una forma de copiar un sector. Llego un poco tarde, pero hay una respuesta más simple y rápida que la de @ Dave. Estas son las instrucciones generadas a partir de un código como el de @ Dave. Estas son las instrucciones generadas por la mía. Como puede ver, hay muchas menos instrucciones. Lo que hace es simplemente lo que hace
append(slice)
, que copia el corte. Este código:Produce esto:
fuente