読んでいてThe Go Programming Language Specifications
、クロージャ本体の後の「()」の意味がよく分からないことに気づきました。
でFunction literals
:
func(ch chan int) { ch <- ACK }(返信ちゃん)`
のDefer statements
例:
// f returns 1
func f() (result int) {
defer func() {
result++
}() // why and how?
return 0
}
クロージャ本体の後に「()」を追加して使用する理由がよくわかりません。誰かがこれを明確に説明してくれることを願っています。
ベストアンサー1
それは、()
(のみ)の後に追加する必要があるものではありません閉鎖defer
の言語仕様は延期文その「表現」を義務付けるいつも関数呼び出しである必要があります。
なぜそうなるのでしょうか? これは、'defer' の有無にかかわらず、他の関数と同じです。
考慮する:
func f() int { return 42 }
そして
a := f
対
b := f()
最初の式のRHSは関数値です。2番目のバージョンではRHSは値です関数によって返される- つまり関数呼び出しです。
次の意味も同様です:
defer f
対
defer f()
ただし、最初のバージョンは「defer」のコンテキストでは意味をなさないため、仕様では 2 番目の形式のみにする必要があると記載されています。
また、上で説明した 'defer' ステートメントの外部の関数呼び出しとの直交性により、学習も簡単だと私は思います。
また、関数呼び出しは fn-expr の後に が続くだけでなく()
、式リストが通常は括弧内にあります (空のリストを含む)。次の 2 つには大きな違いがあります。
for i := range whatever {
defer func() { fmt. Println(i) }()
}
そして
for i := range whatever {
defer func(n int) { fmt. Println(n) }(i)
}
最初のバージョンは、クロージャが閉じた瞬間に「i」の値を出力します。実行する2番目は、defer文が実行された瞬間の「i」の値を出力します。だった処刑された。