una que programacion matriz lenguaje inicializar estructuras como cargar arreglos arreglo array arrays go slice

arrays - que - Forma correcta de inicializar rebanada vacía



como inicializar una matriz en c (4)

Para declarar un segmento vacío, con un tamaño no fijo, es mejor hacerlo:

mySlice1 := make([]int, 0)

o:

mySlice2 := []int{}

Solo me pregunto cuál es la forma correcta.


Como una adición a respuesta de ...

a continuación hay información del libro "Go in action" , que creo que vale la pena mencionar:

Diferencia entre rebanadas nil y empty

Si pensamos en una rebanada como esta:

[pointer] [length] [capacity]

entonces:

nil slice: [nil][0][0] empty slice: [addr][0][0] // points to an address

rebanada nula

Son útiles cuando desea representar un segmento que no existe, como cuando ocurre una excepción en una función que devuelve un segmento.

// Create a nil slice of integers. var slice []int

rebanada vacía

Los sectores vacíos son útiles cuando desea representar una colección vacía, como cuando una consulta de base de datos devuelve cero resultados.

// Use make to create an empty slice of integers. slice := make([]int, 0) // Use a slice literal to create an empty slice of integers. slice := []int{}

Independientemente de si está utilizando un segmento nulo o un segmento vacío, las funciones incorporadas append , len y cap funcionan igual.

Ve ejemplo de patio de recreo :

package main import ( "fmt" ) func main() { var nil_slice []int var empty_slice = []int{} fmt.Println(nil_slice == nil, len(nil_slice), cap(nil_slice)) fmt.Println(empty_slice == nil, len(empty_slice), cap(empty_slice)) }

huellas dactilares:

true 0 0 false 0 0


La división vacía y la división nula se inicializan de manera diferente en Ir:

var nilSlice []int emptySlice1 := make([]int, 0) emptySlice2 := []int{} fmt.Println(nilSlice == nil) // true fmt.Println(emptySlice1 == nil) // false fmt.Println(emptySlice2 == nil) // false

En cuanto a las tres rebanadas, len y cap son 0.


Las dos alternativas que dio son semánticamente idénticas, y supongo que producen las mismas instrucciones de ensamblaje.

Para evitar una asignación innecesaria, en caso de que termine sin usar el segmento, puede dejarlo con un valor nil :

var myslice []int

Como está escrito en el blog Golang.org :

un corte nulo es funcionalmente equivalente a un corte de longitud cero, aunque no apunta a nada. Tiene longitud cero y se puede agregar, con asignación.


Son equivalentes Ver este código:

mySlice1 := make([]int, 0) mySlice2 := []int{} fmt.Println("mySlice1", cap(mySlice1)) fmt.Println("mySlice2", cap(mySlice2))

Salida:

mySlice1 0 mySlice2 0

Ambas rebanadas tienen capacidad 0 , lo que implica que ambas tienen longitud 0 (no puede ser mayor que la capacidad), lo que implica que ambas rebanadas no tienen elementos. Esto significa que las 2 rebanadas son idénticas en todos los aspectos.

Ver preguntas similares:

¿Cuál es el punto de tener una rebanada nula y una rebanada vacía en golang?

nil slices vs non-nil slices vs empty slices in Go language