0

私は Go が初めてで、さまざまな時点で多くのファイルを開く必要があるアプリを作成する必要があります。各ファイルを開くコードは次のようになります。

fl, err := os.Open(..)
check(err)
defer fl.Close()

whereは、何か問題が発生した場合にcheck呼び出すだけです。panic

さて、私が言ったように、そのスニペットはかなりの回数繰り返されます。私はこのようなものが欲しいです:

func foo(f string){
    fl, err := os.Open(f)
    check(err)
    defer fl.Close() //lolwut
}

もちろん、一度foo戻っdeferたら、ファイルを起動して閉じます。

呼び出し元が時間だと判断するまで、関数の延期を延期する方法はありますか?

私がこれまでに試みたのは、遅延を匿名関数に入れ、fooそれを返し、呼び出し元にそれを実行させることです(できればワンライナーで)。それでも、それを実装する際にいくつかの障害にぶつかっています。それが正しいアプローチであるかどうかさえわかりません。

tl;dr: Go で呼び出し元の関数に延期を延期する方法はありますか?

4

1 に答える 1

1

あなたは設計を間違えていると思います。もともとやりたかったことは、あまり意味がありません。呼び出し元に任せたい場合はClose()、呼び出し元から割り当て解除を決定するすべての柔軟性を奪ってしまいます。発信者がファイル自体の持続時間よりも長くファイルを保持しなければならない場合はどうなりますか?

foo()と同じように、リソース割り当て関数と考えることもできますio.Open()。したがって、関数が を呼び出すとfoo()、リソースが割り当てられたことになります。foo().は、このリソースの割り当てを解除する責任を負いません。呼び出し元は、 の場合と同様ですio.Open()

于 2014-08-03T15:27:44.190 に答える