A Tour of Goの練習問題を解説するシリーズ(2/11) – Exercise: Slices

みなさん、こんにちは。人類をGopherにしたいと考えているまるりんです。

A Tour of Goはプログラミング言語Goの入門サイトです。 このシリーズではA Tour of Goの練習問題を解説します。

今回は以下の問題を扱います。

問題
Exercise: Slices
解答
https://go.dev/play/p/zCK8KEIqsJB


まず、

この関数は、長さ dy のsliceに、各要素が8bitのunsigned int型で長さ dx のsliceを割り当てたものを返すように実装する必要があります。

とあるので、文の骨格としては「スライスにスライスを割り当てたものを返す」と読めます。 スライスにスライスを割り当てるサンプルコードを書いてみます。

ソース
https://go.dev/play/p/4qGXFwB8fXW

実行結果

s: [[] []]
s[0]: [0 0 0 0]
s[1]: [0 0 0 0]
s: [[0 0 0 0] [0 0 0 0]]

同じ処理が2回繰り返されているため、ループにします。

ソース
https://go.dev/play/p/QMtPfa8hdg2

実行結果

s: [[] []]
s[0]: [0 0 0 0]
s[1]: [0 0 0 0]
s: [[0 0 0 0] [0 0 0 0]]

スライスのスライスを無事に生成できました。 次に、スライスに指定の長さを割り当てます。

この関数は、長さ dy のsliceに、各要素が8bitのunsigned int型で長さ dx のsliceを割り当てたものを返すように実装する必要があります。

とあるので、要約すると「スライス(長さはdy)にスライス(長さはdx)を割り当てたものを返す」と読めるのでdy、dxを割り当てます。

ソース
https://go.dev/play/p/eL3GXT-q-EZ

実行結果

s: [[] []]
s[0]: [0 0 0 0]
s[1]: [0 0 0 0]
s: [[0 0 0 0] [0 0 0 0]]

次に、

各要素が8bitのunsigned int型で長さ dx のslice

とあります。長さがdxのスライスの各要素を表示してみます。

ソース
https://go.dev/play/p/ms32gGsR1T4

実行結果

s: [[] []]
s[0][0]: 0
s[0][1]: 0
s[0][2]: 0
s[0][3]: 0
s[1][0]: 0
s[1][1]: 0
s[1][2]: 0
s[1][3]: 0
s: [[0 0 0 0] [0 0 0 0]]

次に、

例えば、面白い関数に、 (x+y)/2 、 x*y 、 x^y などがあります。

とありますが、これらの式を具体的にどこで使用するのかは書かれていません。しかし、

ヒント:( uint8(intValue) を型の変換のために使います)

をみる限り、intをuint8に変換するようです。先ほど表示したスライスの要素の型がuint8なのでおそらくここに代入すればよいと分かります。 ちなみに (x + y) / 2 の評価結果の型はintのため、uint8に変換する必要があります。

ソース
https://go.dev/play/p/zCK8KEIqsJB

実行結果

fig