結局のところ、それはグローバル変数ですか?
はい。変数はルートレベルで定義されるため、パッケージ全体でグローバルになります。
net/http
ただし、これはパッケージのすべての重要な情報を格納するグローバル変数ではありません。net/http
これは、パッケージのコンテンツを使用してユーザーにクイックスタートの機会を提供する便利なセットアップにすぎません。これはまた、それはそれほど複雑さを追加しないことを意味します。
これは良い習慣と見なされますか、それともゴランイディオムと見なされますか?
IMO、パッケージの使用についてユーザーを支援することをお勧めします。適切なデフォルト構成を提供することでユーザーの時間を節約できることがわかった場合は、そうしてください。
ただし、変数をエクスポートするときは注意が必要です。同時アクセスの準備をする必要があります。たとえば、(またはより良い、基礎となる)は、スレッドDefaultServeMux
セーフにするためにミューテックスを使用しています。ServeMux
Goではグローバル変数は常にスレッド/ゴルーチンで安全ですか?
いいえ。適切な同期(ミューテックス、チャネルなど)がないと、同時にアクセスされるすべてのものに問題が発生し、間違いなくすべてが断片的になります。
私は他の言語/標準ライブラリでそのような練習を見たことがありません。
logging
たとえば、Pythonのモジュールは、ルートロギングオブジェクトを取得する関数を提供します。この関数を呼び出して、ロギングの動作をカスタマイズできます。これは可変であり、モジュールで定義されているため、グローバルオブジェクトと見なすことができます。