QA@IT

A Tour of Go

2618 PV

Go言語のチュートリアルA Tour of Go #36の問題で以下のように記述し、

package main

import "code.google.com/p/go-tour/pic"

func Pic(dx, dy int) [][]uint8 {
    s := make([][]uint8, dy)
    for i := range s {
        s[i] = make([]uint8, dx)
        for j := range s[i] {
            s[i][j] = uint8(i ^ j)
        }
    }
    return s
}

func main() {
    pic.Show(Pic(100, 100))
}

実行するとエラーになりました。

prog.go:17: cannot use Pic(100, 100) (type [][]uint8) as type func(int, int) [][]uint8 in function argument
 [process exited with non-zero status]

回答例を検索してみると、どうもmain()内にあるPic関数の引数がまずいようで、引数を削除して

    pic.Show(Pic)

実行すると、エラーは無く正常に動作しました。

Pic関数は引数ありで定義しているのに指定するとエラーになり、逆に指定しないとエラーでなくなるのかが理解できません。ご存知の方いらっしゃいましたら教えてください.

回答

エラーとなった原因はPicの使い方ではなくShowの使い方です。
pic.Showの定義を見てみると

https://code.google.com/p/go-tour/source/browse/pic/pic.go

func Show(f func(int, int) [][]uint8) {

となっており、Showは値ではなくて関数を受け取るという事がわかります。

Show( Pic(100,100) ) 

として実行すると、Showに渡されるのはPicが処理した[][]uint8のデータです。
Showが欲しいのはfunc(int, int) [][]uint8関数なので実行しないで渡してあげる必要があります。

これによって、Show関数の好きなタイミングで渡した関数(Pic)を実行でき、さらにその関数の振る舞いをShow関数の外で決められるわけです。

編集 履歴 (1)
  • 関数を渡すのは考えてませんでした。精進します。。。
    わかりやすい解説ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。