2016-04-24 7 views
4

私はstructを持っていますが、これはオブジェクトを生成してポインタを返す、私が書いたnewメソッドを持っています。golangでオブジェクトを作成した後にメソッドを使用する方法を教えてください。

もう1つの方法、たとえばCloseがあります。ただし、オブジェクトが作成された後は、このメソッドを呼び出す必要はありません。私はオブジェクトが作成されている場合、このメソッドを呼び出さなければならないことを確認したい。ゴランではどうしたらいいですか?これが可能であれば、私はこれもどちらとも呼ばれているのか分かりません。助けてください。ありがとうございました。

答えて

5

Close()メソッドを強制的に呼び出す方法はありません。あなたのタイプの値がもう必要でない場合は、そのメソッドClose()を呼び出さなければならないことを明確に文書化することが最善の方法です。

プログラムが強制終了される極端な状況では、コードが実行される保証はありません。

runtime.SetFinalizer()関数があります。ガベージコレクタが値/ブロックに到達できないことが検出されたときに呼び出される関数を登録することができます。しかし、プログラムが終了する前に登録された機能が実行されるという保証はありません。その文書から引用する:

プログラムが終了する前にファイナライザが実行されるという保証はないため、通常、長期実行プログラム中にオブジェクトに関連付けられた非メモリリソースを解放する場合にのみ有効です。

あなたのタイプを非エクスポートにすることですが、NewMyType()のようなエクスポートされたコンストラクタ関数を提供して、構造体/タイプを適切に初期化することができます。また、具体的な型ではなく、インターフェイスの種類を返します。インターフェイスには、他のユーザーがあなたの値を使ってやりたいことがすべて含まれている必要があります。そして、あなたの具体的なタイプはもちろん、そのインターフェイスを実装する必要があります。値を入力して他の人にClose()メソッドを呼び出させることはできませんが、少なくとも不適切な初期化を心配する必要はありません。

+0

ありがとうございます。デストラクタだけでなく、 'object.run()'のようないくつかの変数を設定するメソッドがあり、オブジェクトが何らかのnilpointerエラーをスローすることができない場合、 '.run() 'メソッド? – scott

+0

@scott編集された回答を参照してください。 – icza

+0

完璧な@icza、ありがとう。 – scott

1

要するに、外出先ではできません。

あなたが探している用語は、Goが実装していないデストラクタです。詳細については、こちらの優秀な回答をお読みください。Go destructors?

関連する問題