2017-07-08 5 views
0

私はポストコードロケーション検索パッケージを作成しています.CSVからすべてのukポストコードをロードしています。一番良い情報を知りたいときは、データをロードするだけですGoでこれを実現するパターン。一度ロードされたデータセットでパッケージを実行

type Location struct { 
    Latitude float64 
    Longitude float64 
} 

var postCodeCache = make(map[string]Location) 

これは私のデータ型ですが、現在はLoadDataとLookupPostCode()という関数があります。理想的には私のパッケージをインポートしたいのですが、まだロードされていなければデータを自動的にロードします。

答えて

0

次の2つのオプションが持っている:

  1. 最も単純には、他の処理を開始する前にメインでデータをロードです。あなたがデータを読む確率が非常に高く、それを直ちにやることを避けるべき他の理由がない場合、どうしてですか?

  2. sync.Onceでデータをロードします。何かのように:

    var dataLoaded sync.Once 
    var data DataType = nil 
    
    func LookupPostCode(some_args) { 
        once.Do(func() { 
         data = LoadData(some_subset_of_some_args) 
        }) 
        // and here I know, that data are loaded 
    } 
    
+0

'sync.Once'は不要な依存関係ではありませんか? 'data'はロードされていないときは単に' nil'であり、ロードされていれば 'nil'ではありませんか? –

+0

@ChronoKitsune英国の郵便番号は175万件になります。このデータをロードするのにかかる時間に、複数のゴルーチンが 'LookupPostCode'を呼び出した可能性があります。 'sync.Once'がなければ、彼らはそれぞれCSVの読み込みを開始します。それによって、彼らはフィニッシュの最初のコールですべてブロックされます。 – terinjokes

+0

@terinjokes意味がありますが、ボリュームがそれほど大きいときにルックアップ関数がデータを読み込むのはなぜですか?オプション1の行に沿って、おそらくより合理的な考え方は、パッケージの外側にマップを生成し、残りのパッケージをロードすることです。潜在的に遅いインポートですが、パッケージをインポートするたびにファイルからインポートするよりも高速になる可能性があります。もちろん、これは、その大きさの地図リテラルが実装によってサポートされていることを前提としています...私は何らかの制限を認識していないので、AFAIKは実行可能なソリューションです。 –

0

あなたはこれを行うには、あなたのパッケージ内のinit()関数を使用することができます。

頻繁に変更されない場合は、CSVを別の.goファイルのGo Map定義に変換して、コンパイル時にロードされます。

関連する問題