En Go, ¿cuál es la diferencia entre var s []int
y s := make([]int, 0)
?
Encuentro que ambos funcionan, pero ¿cuál es mejor?
go
allocation
slice
Wang Yi
fuente
fuente
nil
segmento, mientras que el segundo crea unempty
segmento (esta es la terminología utilizada por el "Libro de acción" ). Para evitar publicar la misma respuesta aquí también, puede consultar stackoverflow.com/a/45997533/1561148Respuestas:
Además de la respuesta de fabriziom , puede ver más ejemplos en " Go Slices: uso e internos ", donde se menciona el uso de :
[]int
Significa que, para agregar a un segmento, no es necesario asignar memoria primero: el
nil
segmentop int[]
es suficiente como un segmento para agregar.fuente
var p []int
más fácil que usarmake
(que asocio más con la asignación, aunque con un límite de 0, no asignaría nada). En términos de legibilidad, prefiero no usarmake
aquí.p := []int{}
). Dado que usualmente usamos:=
sintaxis para declarar la mayoría de las variables, es más natural tenerla en todas partes en lugar de tener excepciones para los segmentos. Aparte de esto, tratar de pensar en asignaciones generalmente empuja a las personas hacia optimizaciones prematuras.Declaración simple
no asigna memoria y
s
apunta anil
, mientrasasigna memoria y
s
apunta a la memoria a un segmento con 0 elementos.Por lo general, el primero es más idiomático si no conoce el tamaño exacto de su caso de uso.
fuente
make
mapas, porque incluso unmap
espacio vacío necesita espacio asignado para algo de contabilidad.nil
en caso de que su segmento no tenga ningún elemento, en lugar de una matriz vacía. Sin embargo, simake
se usa para crear el segmento, se devolverá una matriz vacía en su lugar, que generalmente es el efecto deseado.var s []int
) produciránull
, mientras que el cálculo del segmento vacío (s := make([]int, 0)
) producirá el esperado[]
Solo encontré una diferencia. Si utiliza
y luego codificas la salida como JSON, obtienes
null
.resultados
[]
como se esperaba.fuente
Un
make
ejemplo un poco más completo (un argumento más en ):Fuera:
O con tipo dinámico de
slice
:Fuera:
fuente