Язык Go. Двумерные срезы (2D)


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

 


Запись опубликована в рубрике Go. Добавьте в закладки постоянную ссылку.

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.