タグ

ブックマーク / qiita.com/ruiu (2)

  • GoでNewなんとかのような関数を不必要に提供しないほうが良い理由 - Qiita

    構造体を定義して、それに対してメソッドを定義して、最後にその構造体をアロケートして初期化するNewなんとかという関数を用意する、というのを何の疑問も持たずに行っているならちょっと考えものだ。途中まではよいが、Newなんとかみたいなのは別に必須ではない。 メソッドとゼロ値 Goでは新しい値は「ゼロ値」で自動的に初期化される。ゼロ値は型ごとに違うが、数値なら0、文字列なら空文字列、ポインタやインターフェイスならnil、といった具合の値だ。構造体ならそれぞれのフィールドがゼロ値で初期化される。 メソッドはそのレシーバーの値のゼロ値に対して問題なく動くように書くほうがよい。構造体Tを割り当てて初期化する関数としてNewTみたいな関数を用意するのは、当に初期化が必要なとき以外はやらないほうがよい。 なぜか、というといくつか理由がある。 NewTの代わりにnew(T)を使うようにすると、エクスポート

    GoでNewなんとかのような関数を不必要に提供しないほうが良い理由 - Qiita
    theatrical
    theatrical 2014/09/03
    基本的にGoはmutableな状態を扱うのが基本だと思ってる。基本データ型のsliceとかmapとかもコピーじゃなくてポインター渡して処理させるとかが推奨っぽいし、パフォーマンスの為にそういうフィロソフィなんだと
  • Goにatexitやグローバルなデストラクタがない理由 - Qiita

    CやC++ではatexit関数で関数を登録しておくと、プログラムの終了時にその関数を自動的に走らせることができる。そういう機能はRubyPythonにもある。 Goにはそういう機能はない。実装を忘れているのではなくて、意図的にそういう機能を持たせていないのだ。これについてIan Lance Taylorさんが大変説得力のある説明をしていた。 まず第一に、どんなプログラムでも任意の箇所でクラッシュしうるし、まったくバグのないプログラムでもいきなりkillで殺されたりマシンが電源断で落ちるということがある。従ってどんなプログラムも、突然終了させられたあとに、もう一度きちんと動くことができなければならない。つまりatexitはきれいに終了するための機能ということで、atexitが呼び出されないとうまく動かないプログラムというのはそもそも間違っているということになる。 大きなC++プログラムでは

    Goにatexitやグローバルなデストラクタがない理由 - Qiita
    theatrical
    theatrical 2014/09/01
    「選択の自由こそが正義!」なC++とは、対象的だな。どちらがよいという事もないだろうけども、少なくともチーム開発ではGoのほうがよいかな。
  • 1