Respuestas:
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
Dado que el valor cero de un segmento (
nil
) actúa como un segmento de longitud cero , puede declarar una variable de segmento y luego agregarla en un bucle:
// Filter returns a new slice holding only
// the elements of s that satisfy f()
func Filter(s []int, fn func(int) bool) []int {
var p []int // == nil
for _, v := range s {
if fn(v) {
p = append(p, v)
}
}
return p
}
Significa que, para agregar a un segmento, no es necesario asignar memoria primero: el nil
segmento p int[]
es suficiente como un segmento para agregar.
var p []int
más fácil que usar make
(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 usar make
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
var s []int
no asigna memoria y s
apunta a nil
, mientras
s := make([]int, 0)
asigna 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.
make
mapas, porque incluso un map
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, si make
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
var list []MyObjects
y luego codificas la salida como JSON, obtienes null
.
list := make([]MyObjects, 0)
resultados []
como se esperaba.
Un make
ejemplo un poco más completo (un argumento más en ):
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Fuera:
length: 2 - capacity 5 - content: [0 0]
O con tipo dinámico de slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Fuera:
length: 2 - capacity 5 - content: [<nil> <nil>]
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/1561148