datastore/sql
の Rows
は Query
で取ってきた後に Close()
を呼び出さないといけない。これはまあ常識。
で、恥ずかしい話だが、最近自分が書いたコードでこのCloseし忘れをやってしまっていた。
おそらく原因としては Exec
から Query
に機械的に変換したときにClose
を付けるのを忘れてたのだと思う。自分はこのパターンで何かしらの処理を付け忘れてしまうことが多い。
しかし人が頑張って Close を書くようにするのではヒューマンエラーがいつか出るのは確実だ。 なので、できれば Go でこういう Close し忘れは検知してもらいたい。
残念ながらそういうことをしてくれるツールを見つけられなかったので、問題を解決するのに次のようなAPIを考えてみた。
resource, close, err := something.Open() defer close()
後処理が必要なリソースを確保する場合には、確保時に終了処理となる関数を返すのがいいのでは?というアイディアだ。 終了処理となる関数をローカル変数に束縛しておけば、これを呼び出さない場合に Go 側で「未使用の変数がある」と検知してくれるはず。 握り潰しそうとした場合もコード上でわかりやすくなるはず。
という感じのことを自作 API ではやろうと思うのだがどうなんだろうか?
こういうことをしているベストプラクティス見つからないので、それほど良さげな解決策ではないのかも。