Golang でクロージャ本体の後に「()」を追加するのはなぜですか? 質問する

Golang でクロージャ本体の後に「()」を追加するのはなぜですか? 質問する

読んでいて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」の値を出力します。だった処刑された。

おすすめ記事