2015.06.01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

MHI 5.0

この「にっき」には暴力シーンやグロテスクな表現が含まれています。

(2015.06.17) 2325

$ #golang でデストラクタ的なことをするのが難しいなら、Ruby の真似をすればいいんじゃね

ここで紹介されている、runtime.SetFinalizer は、 GC が動かない場合などに動作が期待できないそうだ。

Go では defer を使って finally 的なことは出来るが、 それをライブラリから強制的に行う仕組みが残念ながらない。

  • C++ ならデストラクタで、
  • Python なら with 文で、
  • .NET Framework なら using & Dispose メソッドで

行うような自動解放的な仕組みは作れないだろうか。

Ruby なんかだとブロック(昔はイタレータ言うたな)を使って、 資源確保、解放をやるのが定石となっている。 Go では Ruby ほど綺麗な書き方ではないのだが、 クロージャーを使えば同等なことができる。

nyagos の dos モジュールではディレクトリ内を走査する関数を 自前で用意しているのだが、Close 忘れが怖いので、 下記のように使える ForFiles 関数を用意した。

err := ForFiles(pattern, func(findf *FileInfo) bool {
        if name := findf.Name(); name[0] != '.' || pname[0] == '.' {
                match = append(match, filepath.Join(dirname, name))
        }
        return true
})

丸括弧の中に中括弧を書くのは、やや不細工だが、気にしたら負けだ。

.net(3) C++(3) Cygwin(12) GAME(3) Groovy(1) Linux(2) Lua(39) Mercurial(13) NYAOS(92) OS/2(7) Oracle(3) Perl(4) Python(22) SKK(4) Windows8(1) album(68) ckw(10) coLinux(1) vim(6) wifky(27) 書評(21) (9)

zetamattaのたいじゅー