3
として延期で使用する方法を渡す私たちは、簡単にパラメータとして関数を渡すとdefer
でそれを使用することができます。引数
func main() {
test(rec)
}
func test(f func(int)) {
defer f(10)
panic("test")
}
func rec(v int) {
e := recover()
fmt.Println(e)
fmt.Println(v)
}
これは動作します。 Playground。
しかし、我々は方法に合格し、その方法でrecover
を呼び出すために何が必要な場合は?
type MyStruct struct {
Data string
}
func main() {
a := &MyStruct{}
test(a.Recover)
}
func test(f func(int)) {
defer f(10)
panic("test")
}
func (m *MyStruct) Recover(arg int) {
e := recover()
fmt.Println(e)
fmt.Println(arg)
}
ここで私は完全に理解していないいくつかの奇妙な動作をします。 Playground。
メソッドが呼び出されるようですが、recover
はnil
を返します。その後、(別の?)パニックがあります。 golangのドキュメントとGoogleの結果のどれも、私がそのような行動の理由を理解するのを助けたことはありません。私は何が欠けていますか?
それをドキュメント値からの呼び出しが直接呼び出しではないことはドキュメントからは分かりませんでしたが、今では... ありがとうございました! 渡された引数でメソッド値とメソッド式を区別する方法がないことを正しく理解していますか? –
メソッド値を通じた呼び出しが直接呼び出しとみなされない理由を知っていますか? –
メソッド値の引数の数は、基本となるメソッドの引数の数よりも1つ少なくなります。メソッド値の呼び出しはメソッドの直接呼び出しではありません。実行時に関数が与えられると、関数が単純関数、関数リテラル、メソッド式またはメソッド値であるかどうかを判断することはできません。 –