lenguaje golang code go slice pass-by-value

golang - go code



¿Las rebanadas de golang pasan por valor? (1)

Sí, todo en Go se pasa por valor. Rebanadas también. Pero un valor de división es un encabezado , que describe una sección contigua de una matriz de respaldo, y un valor de división solo contiene un puntero a la matriz donde se almacenan los elementos. El valor del segmento no incluye sus elementos (a diferencia de las matrices).

Entonces, cuando pase un sector a una función, se hará una copia desde este encabezado, incluido el puntero, que apuntará a la misma matriz de respaldo. La modificación de los elementos de la división implica la modificación de los elementos de la matriz de respaldo, por lo que todas las divisiones que comparten la misma matriz de respaldo "observarán" el cambio.

Para ver qué hay en un encabezado de sector, consulte el tipo reflect.SliceHeader :

type SliceHeader struct { Data uintptr Len int Cap int }

Consulte la pregunta relacionada / posible duplicada: ¿Se pasa el parámetro de la función de Golang como copia en escritura?

Leer entrada de blog: Go Slices: uso y uso interno

En Golang, estoy tratando de hacer una función de división de Scramble para mi problema de vendedor ambulante. Mientras hacía esto, noté que cuando empecé a editar el sector, le di que la función de codificación era diferente cada vez que lo pasaba.

Después de un poco de depuración, descubrí que se debía a que edité el sector dentro de la función. Pero como se supone que Golang es un lenguaje de "pasar por valor", ¿cómo es esto posible?

https://play.golang.org/p/mMivoH0TuV

He proporcionado un enlace de patio de recreo para mostrar lo que quiero decir. Al eliminar la línea 27 se obtiene una salida diferente a la de dejarla, esto no debería hacer una diferencia ya que se supone que la función debe hacer su propia copia de la porción cuando se pasa como argumento.
¿Alguien puede explicar el fenómeno?