Типы ломтиков - PullRequest
       28

Типы ломтиков

61 голосов
/ 09 октября 2011

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

34 голосов
/ 09 октября 2011

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

Использование встроенного make в функции для среза типа 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
33 голосов
/ 09 октября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...