Non esiste un modo più conciso, quello che hai fatto è il modo "giusto"; perché le fette sono sempre unidimensionali ma possono essere composte per costruire oggetti di dimensioni superiori. Vedi questa domanda per maggiori dettagli: Vai: Com'è la rappresentazione della memoria dell'array bidimensionale .
Una cosa che puoi semplificare è usare il for range
costrutto:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
Si noti inoltre che se si inizializza la sezione con un letterale composto , si ottiene "gratuitamente", ad esempio:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
Sì, questo ha i suoi limiti poiché apparentemente devi enumerare tutti gli elementi; ma ci sono alcuni trucchi, vale a dire non devi enumerare tutti i valori, solo quelli che non sono i valori zero del tipo di elemento della fetta. Per ulteriori dettagli su questo argomento , vedere Elementi con chiave nell'inizializzazione dell'array golang .
Ad esempio, se vuoi una fetta in cui i primi 10 elementi sono zeri, e poi segue 1
e 2
, può essere creata in questo modo:
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
Si noti inoltre che se si utilizzano array invece di slice , è possibile crearli molto facilmente:
c := [5][5]uint8{}
fmt.Println(c)
L'output è:
[[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]]
In caso di array non è necessario iterare sull'array "esterno" e inizializzare gli array "interni", poiché gli array non sono descrittori ma valori. Vedi il post del blog Array, slice (e stringhe): The Mechanics of 'append' per maggiori dettagli.
Prova gli esempi su Go Playground .
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
quando provo ad assegnare l'array a ciò che immagino di dire a Go è uno slice.