Нарезать ломтиками видах
В настоящее время я работаю свой путь через прекрасные тур по ГО. Я закончил одно из упражнений (#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 ответа:
нет другого способа сделать это в 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