質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

1089閲覧

A Tour of GoのExercise:Slices

jgvkmea

総合スコア25

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2020/04/01 04:34

Go言語の勉強としてA Tour of Goを進めており、Exercise:Slicesに取り組んでいるところで疑問が出てきました。
こちらのExerciseの回答はこちらの通りのなっており、
これを見るとPicメソッドはint型の引数を2つ受け取らないといけないと思うのですが、実際には引数なしでPicを呼び出すと期待通りの結果が表示され、むしろ引数を渡して呼び出そうとするとエラーになってしまいます。
なぜこのPicメソッドを呼び出す際に引数を渡す必要がないのでしょうか?
ご回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結論としては、Show 関数の引数には関数を渡すためです。


https://qiita.com/rock619/items/f412d1f870a022c142d0#exercise-slices

にある以下の Show 関数がポイントです。

go

1func main() { 2 pic.Show(Pic) 3}

Show 関数は実際には以下のようになっています。

go

1func Show(f func(int, int) [][]uint8) { 2 const ( 3 dx = 256 4 dy = 256 5 ) 6 data := f(dx, dy) 7 m := image.NewNRGBA(image.Rect(0, 0, dx, dy)) 8 for y := 0; y < dy; y++ { 9 for x := 0; x < dx; x++ { 10 v := data[y][x] 11 i := y*m.Stride + x*4 12 m.Pix[i] = v 13 m.Pix[i+1] = v 14 m.Pix[i+2] = 255 15 m.Pix[i+3] = 255 16 } 17 } 18 ShowImage(m) 19}

https://github.com/golang/tour/blob/master/pic/pic.go#L15-L33

この関数のシグネチャを見ると分かりますが、func(int, int) [][]uint8 となっています。
実際には Show を呼び出したときにはこの Show の中で引数として渡された値(関数型です)を実行しています。

go

1data := f(dx, dy)

の部分です。よって、

int型の引数を2つ受け取らないといけない

ではなく関数を渡しているため OK ということです。

投稿2020/04/01 04:46

d_tutuz

総合スコア730

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jgvkmea

2020/04/01 05:37

なるほど、 pic.Show(Pic) は、Picメソッドを呼び出した結果をShowメソッドに渡しているのではなく、 Picメソッド自体をShowメソッドに渡していて、Showメソッド内でPicメソッドを呼び出しているのですね! とてもわかりやすく、かつ迅速なご回答ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問