Não existe uma forma mais concisa, o que você fez é da maneira "certa"; porque as fatias são sempre unidimensionais, mas podem ser compostas para construir objetos de dimensões superiores. Veja esta pergunta para mais detalhes: Go: Como é a representação da memória de um array bidimensional .
Uma coisa que você pode simplificar é usar a for range
construção:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
Observe também que se você inicializar sua fatia com um literal composto , você obterá isso "gratuitamente", por exemplo:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
Sim, isso tem seus limites, pois aparentemente você tem que enumerar todos os elementos; mas existem alguns truques, nomeadamente você não tem que enumerar todos os valores, apenas aqueles que não são os valores zero do tipo de elemento da fatia. Para obter mais detalhes sobre isso, consulte Itens codificados na inicialização do array golang .
Por exemplo, se você deseja uma fatia em que os primeiros 10 elementos são zeros e, em seguida, segue 1
e 2
, pode ser criada assim:
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
Observe também que, se você usar matrizes em vez de fatias , elas podem ser criadas com muita facilidade:
c := [5][5]uint8{}
fmt.Println(c)
O resultado é:
[[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]]
No caso de arrays, você não precisa iterar sobre o array "externo" e inicializar os arrays "internos", pois os arrays não são descritores, mas valores. Veja a postagem do blog Matrizes, fatias (e strings): A mecânica de 'anexar' para mais detalhes.
Experimente os exemplos no Go Playground .
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
quando tento atribuir o array ao que acho que estou dizendo a Go é um slice.