giantneco’s blog

技術メモ

Go で後処理が必須になる場合の API

datastore/sqlRowsQuery で取ってきた後に Close() を呼び出さないといけない。これはまあ常識。

で、恥ずかしい話だが、最近自分が書いたコードでこのCloseし忘れをやってしまっていた。

おそらく原因としては Exec から Query機械的に変換したときにCloseを付けるのを忘れてたのだと思う。自分はこのパターンで何かしらの処理を付け忘れてしまうことが多い。

しかし人が頑張って Close を書くようにするのではヒューマンエラーがいつか出るのは確実だ。 なので、できれば Go でこういう Close し忘れは検知してもらいたい。

残念ながらそういうことをしてくれるツールを見つけられなかったので、問題を解決するのに次のようなAPIを考えてみた。

resource, close, err := something.Open()
defer close()

後処理が必要なリソースを確保する場合には、確保時に終了処理となる関数を返すのがいいのでは?というアイディアだ。 終了処理となる関数をローカル変数に束縛しておけば、これを呼び出さない場合に Go 側で「未使用の変数がある」と検知してくれるはず。 握り潰しそうとした場合もコード上でわかりやすくなるはず。

という感じのことを自作 API ではやろうと思うのだがどうなんだろうか?

こういうことをしているベストプラクティス見つからないので、それほど良さげな解決策ではないのかも。