Из главы номер 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 — чтобы был понятнее механизм построения графика 🙂
