Il n'y a pas de manière plus concise, ce que vous avez fait est la «bonne» manière; parce que les tranches sont toujours unidimensionnelles mais peuvent être composées pour construire des objets de dimension supérieure. Voir cette question pour plus de détails: Aller: Comment est la représentation mémoire d'un tableau à deux dimensions .
Une chose que vous pouvez simplifier est d'utiliser la for range
construction:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
Notez également que si vous initialisez votre tranche avec un littéral composite , vous obtenez ceci gratuitement, par exemple:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
Oui, cela a ses limites car apparemment, vous devez énumérer tous les éléments; mais il y a quelques astuces, à savoir que vous n'avez pas à énumérer toutes les valeurs, seulement celles qui ne sont pas les valeurs nulles du type d'élément de la tranche. Pour plus de détails à ce sujet, consultez Éléments clés dans l'initialisation du tableau golang .
Par exemple, si vous voulez une tranche où les 10 premiers éléments sont des zéros, puis suit 1
et 2
, elle peut être créée comme ceci:
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
Notez également que si vous utilisez des tableaux au lieu de tranches , il peut être créé très facilement:
c := [5][5]uint8{}
fmt.Println(c)
La sortie est:
[[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]]
Dans le cas de tableaux, vous n'avez pas à parcourir le tableau «externe» et à initialiser les tableaux «internes», car les tableaux ne sont pas des descripteurs mais des valeurs. Voir le billet de blog Tableaux, tranches (et chaînes): les mécanismes de 'append' pour plus de détails.
Essayez les exemples sur le Go Playground .
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
quand j'essaye d'assigner le tableau à ce que je suppose que je dis que Go est une tranche.