2012-09-01 10 views
13

golangパッケージ "net/http"は、グローバル変数DefaultServeMuxを使用してハンドラを登録します。これは良い練習かゴランのイディオムだと考えられますか?結局のところ、グローバル変数ですか?"net/http"のグローバル変数の使用はgolangの良い習慣と考えられていますか?

グローバル変数を使用しない2つの主な理由は、AFAIK 1)が複雑になり、2)並行プログラムで問題があることです。

おそらく1)は、開発者がDefaultServerMuxを使用しないことを選択できるので、この場合重要ではないと考えられますか? 2)はどうですか?グローバル変数は常にGoでthread/goroutineで安全ですか?それでも、私はそれがGoの標準ライブラリで使用されていることに驚いています。他の言語/標準ライブラリでこのような実践を見たことはありません。

答えて

19

結局のところ、グローバル変数ですか?

はい。変数はルートレベルのdefinedで、パッケージ全体でグローバルになります。

ただし、net/httpパッケージのすべての有益な情報 を格納するグローバル変数ではありません。これは、 net/httpパッケージのコンテンツを使用して、ユーザーにクイックスタートの機会を提供する便利な設定です。 これは、あまり複雑ではないことを意味します。

これは良い練習ですか、ゴランのイディオムですか?

IMO、パッケージを使用する際にユーザーを支援することをお勧めします。 のデフォルト設定を使用して、ユーザーをしばらく節約できることがわかっている場合は、そうしてください。

ただし、変数をエクスポートするときは注意が必要です。 これらは同時にアクセスできるように準備する必要があります。 DefaultServeMux(またはそれより優れているのは、ServeMux)は、たとえば、スレッドセーフであることはusing a mutexです。

グローバル変数は常にGoでスレッド/ゴルーチンが安全ですか?

いいえ、適切に同期されていなければ(mutex、channel、...)、同時にアクセスされるものはすべて問題があり、すべてをビットとピースに吹き飛ばします。

他の言語/標準ライブラリでこのような実践を見たことはありません。

Pythonのloggingモジュールは、例えば、1つは、ロギング動作をカスタマイズするためのメソッドを呼び出すことができ、ルートログオブジェクトを取得する機能を提供します。これはモジュール内で可変で定義されているため、グローバルオブジェクトと見ることができます。

1

globvarは、この例では、パッケージ "log"に見られる類似物が安全であり、良い選択肢であることがわかります。

IOW、クレーム1は漠然としており、クレーム2は制限されています:sometime/somewhere true、そうでなければfalse ==はそれと同じように使用されても一般的には成り立たない。

関連する問題