¿Las rebanadas golang pasan por valor?

En Golang, estoy tratando de hacer una función de división de lucha para mi problema de vendedor ambulante. Mientras hacía esto noté que cuando comencé a editar la porción que di, la función de aleatorización era diferente cada vez que la pasaba.

Después de algunas depuraciones descubrí que era debido a que editaba la porción dentro de la función. Pero dado que se supone que Golang es un lenguaje “paso por valor“, ¿cómo es 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 obtienes un resultado diferente al de dejarlo, esto no debería marcar una diferencia ya que se supone que la función debe hacer su propia copia del segmento cuando se pasa como un argumento.
¿Alguien puede explicar el fenómeno?

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

Por lo tanto, cuando pasa una porción a una función, se realizará 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 lo que hay en un encabezado de reflect.SliceHeader , revisa el tipo reflect.SliceHeader :

 type SliceHeader struct { Data uintptr Len int Cap int } 

Ver pregunta duplicada relacionada / posible: ¿Se pasa el parámetro de la función Golang como copy-on-write?

Leer la publicación del blog: Go Slices: uso y funcionamiento interno

    Intereting Posts