私はポストコードロケーション検索パッケージを作成しています.CSVからすべてのukポストコードをロードしています。一番良い情報を知りたいときは、データをロードするだけですGoでこれを実現するパターン。一度ロードされたデータセットでパッケージを実行
type Location struct {
Latitude float64
Longitude float64
}
var postCodeCache = make(map[string]Location)
これは私のデータ型ですが、現在はLoadDataとLookupPostCode()という関数があります。理想的には私のパッケージをインポートしたいのですが、まだロードされていなければデータを自動的にロードします。
'sync.Once'は不要な依存関係ではありませんか? 'data'はロードされていないときは単に' nil'であり、ロードされていれば 'nil'ではありませんか? –
@ChronoKitsune英国の郵便番号は175万件になります。このデータをロードするのにかかる時間に、複数のゴルーチンが 'LookupPostCode'を呼び出した可能性があります。 'sync.Once'がなければ、彼らはそれぞれCSVの読み込みを開始します。それによって、彼らはフィニッシュの最初のコールですべてブロックされます。 – terinjokes
@terinjokes意味がありますが、ボリュームがそれほど大きいときにルックアップ関数がデータを読み込むのはなぜですか?オプション1の行に沿って、おそらくより合理的な考え方は、パッケージの外側にマップを生成し、残りのパッケージをロードすることです。潜在的に遅いインポートですが、パッケージをインポートするたびにファイルからインポートするよりも高速になる可能性があります。もちろん、これは、その大きさの地図リテラルが実装によってサポートされていることを前提としています...私は何らかの制限を認識していないので、AFAIKは実行可能なソリューションです。 –