Нарезать ломтиками видах


В настоящее время я работаю свой путь через прекрасные тур по ГО. Я закончил одно из упражнений (#45) следующее решение:

func Pic(dx, dy int) [][]uint8 {
    pic := make([][]uint8, dy) /* type declaration */
    for i := range pic {
        pic[i] = make([]uint8, dx) /* again the type? */
        for j := range pic[i] {
            pic[i][j] = uint8((i+j)/2)
        }
    }
    return pic
}

Я не понимаю, почему я должен использовать make заявление с uint8 введите дважды (см. комментарии в сниппете). Это кажется излишним, но я не могу понять, как сделать это по-другому.

2 56

2 ответа:

нет другого способа сделать это в Go.

Да, я согласен, что это многословно, но необходимо. Второе утверждение make() полностью не зависит от первого. Можно утверждать, что компилятор должен быть в состоянии определить тип pic[i], но это не на данный момент.

еще один момент: как будет выглядеть оператор make (), если вы опустите тип во втором случае? Make () по-прежнему требуется, чтобы выполнить фактическое распределение и иметь возможность указать необходимый лен / емкость.

в качестве примечания, вы перепутали длины среза. В упражнении говорится, что срез верхнего уровня должен иметь длину dy, а не dx Как вы положили в свой код.

чтобы быть явным, мы можем использовать круглые скобки для перезаписи [][]uint8 как []([]uint8): кусочек (кусочки типа uint8).

С помощью сделать встроенная функция, для фрагмент типа T,make(T, n) возвращает фрагмент типа T длиной n и емкость n.

таким образом, make([][]uint8, 2) эквивалентно make([]([]uint8), 2), он возвращает срез, с длиной и емкостью 2, из кусочков типа uint8, где каждый кусочек типа uint8 инициализируется в нулевое значение (nil ссылка с длиной и мощностью ноль).

многомерные срезы зазубрены и аналогичны многомерным зубчатые массивы.

например,

package main

import "fmt"

func main() {
    ss := make([][]uint8, 2) // ss is []([]uint8)
    fmt.Printf("ss:    %T %v %d\n", ss, ss, len(ss))
    for i, s := range ss { // s is []uint8
        fmt.Printf("ss[%d]: %T %v %d\n", i, s, s, len(s))
    }
}

выход:

ss:    [][]uint8 [[] []] 2
ss[0]: []uint8 [] 0
ss[1]: []uint8 [] 0