2016-05-21 18 views
0

Pythonでは、コンテキストマネージャが本当に役に立ちました。私はに行くことを試みていたに行く。Goでコンテキストマネージャを作成することはできますか?

例えば:オープンは、暗黙的に開いたファイルを閉じるの面倒を入り口と出口を扱うPythonでコンテキストマネージャ、ある

with open("filename") as f: 
    do something here 

。代わりに、私たちは、明示的にこのようにすることの

f := os.Open("filename") 
//do something here 
defer f.Close() 

が、これは、同様ゴーで行うことができますか?前もって感謝します。

+0

https://coderwall.com/p/p1fckg/context-managers-in-go- – ddotsenko

答えて

4

いいえ、あなたがすることはできませんが、あなたは少しラッパーFUNCと同じような錯覚を作成することができます。

func WithFile(fname string, fn func(f *os.File) error) error { 
    f, err := os.Open(fname) 
    if err != nil { 
     return err 
    } 
    defer f.Close() 
    return fn(f) 
} 
+0

実際に私はファイルの開閉を探しているだけではありませんでした。ちょうど例としてそれを提供しました。多かれ少なかれ、 '__enter__'や' __exit__'のようなものを探しています。これはPythonで持っています。 – chinmay

+0

@Chinmay答えはまだありません。['runtime.SetFinalizer'](https://golang.org/pkg/runtime/#SetFinalizer)ですが、必ず実行されるとは限らないので実際には中継してはいけません。 – OneOfOne

+0

ありがとう、それを答えとしてマークすると、メソッドWithFileの使い方を提供して完成させることができるかもしれません。 – chinmay

関連する問題