Из главы номер 18 тура в Го.. Вообще, задания в этом туре весьма зудодробительные B) Итак…
Реализуйте функцию Pic
. Она должна вернуть фрагмент длины dy
, каждый элемент которого представляет собой фрагмент dx
8-битных беззнаковых целых чисел. Когда вы запустите программу, она отобразит вашу картинку, интерпретируя целые числа как значения градаций серого (ну, или голубого).. Нарисует что-то вроде картинки слева.
Выбор изображения остается за вами. Интересные функции включают (x+y)/2, x*y или x^y.
(Необходимо использовать цикл для выделения каждого []uint8 внутри [][]uint8).
(Для преобразования между типами используйте uint8(intValue)).
Комментарий:
Основная проблема для новичков — понять, почему ни черта не передается в Pic(). Секрет в том, чтобы заглянуть под капот pic.Show.
Следующая проблема — вкурить двумерные слайсы. В этом вам поможет этот пример:
package main import ( "fmt" ) func main() { slice := make([][]uint8, 5) fmt.Printf("make([][]uint8, 5) = %v\n", slice) for y := range slice { slice[y] = make([]uint8, 3) } fmt.Printf("+ make([]uint8, 3) = %v\n", slice) }
В целом, задание довольно неудачное для обучения новичков 🙂 Слишком заморочено.. Хорошо для нердов, плохо для казуалов. Но что уж есть. Грызи гранит, пригодится!
Решение:
package main import ( "golang.org/x/tour/pic" ) func Pic(dx, dy int) [][]uint8 { // dx and dy is equal to 256 in pic.Show() // allocate slice ([[] [] ... []]) slice := make([][]uint8, 256) //fmt.Printf("%v\n", slice) // add 2nd dimension of slice [[0 0 ..] ... [.. 0 0]] for y := range slice { slice[y] = make([]uint8, 256) // put data to each element for x := range slice[y] { slice[y][x] = uint8(x * y) } } return slice } func main() { pic.Show(Pic) }
p.s.
Я спецом подставил 256, а не dy/dx — чтобы был понятнее механизм построения графика 🙂