私は小さな問題に遭遇しましたが、それには少し醜い解決策しかありません。私が最初だとは想像できませんが、SOに関する手がかりは見つかりませんでした。
walk
次の (意図的に簡略化された) 例では、 my である関数にレシーバーが必要filepath.WalkFunc
です。
package main
import (
"fmt"
"os"
"path/filepath"
)
type myType bool
func main() {
var t myType = true
// would have loved to do something as:
// _ = filepath.Walk(".", t.walk)
// that does not work, use a closure instead
handler := func(path string, info os.FileInfo, err error) error {return t.walk(path, info, err)}
_ = filepath.Walk(".", handler)
}
func (t myType) walk(path string, info os.FileInfo, err error) error {
// do some heavy stuff on t and paths
fmt.Println(t, path)
return err
}
Funcmain()
がトリガーされ、 へwalk()
のレシーバーがあるため、この醜いクロージャーを への引数として使用する以外に方法が見つかりません。もっと似
たようなものを望んでいましたが、うまくいきません。コンパイルエラー「メソッドt.walkは式ではありません。呼び出す必要があります」が表示されますt
walk()
handler
filepath.Walk()
fileWalk(".", t.walk)
この点で私の閉鎖ソリューションは正しいアプローチですか、それとも私が知らないより良いオプションがありますか?
PS。これは、このクロージャー構造を使用して、レシーバーを持つハンドラー関数を渡す必要がある場合の 1 つです。したがって、この質問は、動作よりもハンドラー関数の受け渡しに関連していfilepath
ます。
ご提案いただきありがとうございます。