No hay una forma más concisa, lo que hiciste es la forma "correcta"; porque los cortes son siempre unidimensionales pero pueden estar compuestos para construir objetos de dimensiones superiores. Consulte esta pregunta para obtener más detalles: Ir: ¿Cómo es la representación de memoria de matriz bidimensional .
Una cosa que puede simplificar es usar la for range
construcción:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
También tenga en cuenta que si inicializa su segmento con un literal compuesto , lo obtiene "gratis", por ejemplo:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
Sí, esto tiene sus límites ya que aparentemente hay que enumerar todos los elementos; pero hay algunos trucos, es decir, no es necesario enumerar todos los valores, solo los que no son los valores cero del tipo de elemento del segmento. Para obtener más detalles sobre esto, consulte Elementos con clave en la inicialización de la matriz golang .
Por ejemplo, si desea un segmento donde los primeros 10 elementos son ceros, y luego sigue 1
y 2
, se puede crear así:
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
También tenga en cuenta que si usa matrices en lugar de porciones , se puede crear muy fácilmente:
c := [5][5]uint8{}
fmt.Println(c)
La salida es:
[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
En el caso de matrices, no es necesario iterar sobre la matriz "externa" e inicializar las matrices "internas", ya que las matrices no son descriptores sino valores. Consulte la publicación de blog Arrays, slices (y strings): The Mechanics of 'append' para obtener más detalles.
Pruebe los ejemplos en Go Playground .
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
cuando trato de asignar la matriz a lo que supongo que le estoy diciendo a Go es una porción.