array - golang size
¿Cuál es el punto de tipo de corte en Go? (5)
He leído this pero aún no estoy completamente consciente de la ventaja de la slice
contra la array
. Así que espero que alguien explique SO tan mejor que eso y estoy seguro de que puede :)
Además de las respuestas ya dadas, los segmentos pueden dimensionarse dinámicamente, mientras que las matrices no pueden serlo. Es decir, solo puede usar constantes para especificar el tamaño de una matriz, mientras que puede usar una variable para especificar el tamaño de una división.
Creo que los cortes y matrices se describen mucho mejor y con más detalle en esta publicación en Go Blog.
En go
, las matrices se pasan por valor; entonces, para "pasar por referencia", usas una porción. ¡Y eso no es todo! Citando el tutorial de Go:
El tamaño de la matriz es parte de su tipo; sin embargo, se puede declarar una variable de división, a la que se puede asignar un puntero a cualquier matriz con el mismo tipo de elemento o, mucho más comúnmente, una expresión de división de la forma a [bajo: alto], que representa el subarray indexado por bajo a alto-1. Las divisiones se parecen mucho a las matrices pero no tienen un tamaño explícito ([] vs. [10]) y hacen referencia a un segmento de una matriz subyacente, a menudo anónima, regular. Múltiples segmentos pueden compartir datos si representan partes de la misma matriz; Las matrices múltiples nunca pueden compartir datos.
Los cortes son mucho más comunes en los programas Go que en los arreglos regulares; Son más flexibles, tienen semánticas de referencia y son eficientes. Lo que les falta es el control preciso del diseño de almacenamiento de una matriz regular; Si desea tener cientos de elementos de una matriz almacenados dentro de su estructura, debe usar una matriz regular.
Al pasar una matriz a una función, casi siempre desea declarar que el parámetro formal es un sector. Cuando llame a la función, tome la dirección de la matriz y Go creará (de manera eficiente) una referencia de división y la pasará.
Las rebanadas tienen muchos usos sobre los arrays, varios de los cuales otros carteles ya han mencionado.
- Las rebanadas pueden funcionar de muchas maneras como punteros.
- Múltiples cortes pueden "apuntar" a la misma matriz base
- Los segmentos se pasan por referencia, pero como un segmento en sí mismo es un puntero, se puede usar para pasar "arreglos" de manera mucho más eficiente, ya que no es necesario copiar todo el arreglo.
- Sin embargo, a diferencia de los punteros, los cortes proporcionan una mayor seguridad de almacenamiento
- Los desbordamientos y desbordamientos de rebanadas activan excepciones, en lugar de permitirle una capacidad insegura para acceder a otras áreas de la memoria.
- Los segmentos permiten limitar el acceso solo a ciertas áreas de una matriz. Esto puede ser extremadamente útil para trabajar con subconjuntos.
- La longitud de un sector se determina dinámicamente en tiempo de ejecución, a diferencia de los arreglos que tienen sus tamaños fijos en el momento de la compilación. Además, los segmentos se pueden redimensionar dinámicamente en tiempo de ejecución.
Los segmentos proporcionan una forma segura y eficiente de referenciar, acceder y mutar partes contiguas de una matriz sin copiar la matriz completa (ya que los objetos y las matrices se pasan por valor), o pasar un puntero a la matriz, un índice de inicio y una longitud .