2017-06-04 7 views
2

チャネルへのポインタを使用するのは良い方法ですか?たとえば、私はデータを同時に読み込み、map[string]stingチャンネルを使ってこのチャンネルをgetSameValues()の内部で処理します。チャネルへのポインタの使用

func getSameValues(results *chan map[string]string) []string { 
    var datas = make([]map[string]string, len(*results)) 
    i := 0 
    for values := range *results { 
     datas[i] = values 
     i++ 
    } 
} 

chan map[string]stringはマップ内のデータの何百万人の周りがあるでしょうし、それは、複数のマップとなりますので、私はこれを行う理由があります。

私は、メモリへのリソースを節約するためにデータをコピーしないように、関数へのポインタを渡すことができればよいアプローチだと思います。

私はeffective goで良い習慣を見つけられませんでした。だから私はここで私のアプローチについて疑いがあります。

答えて

4

通常、チャネルへのポインタを使用するのは適切ではありません。

チャネル値のサイズは、ポインタのサイズと同じです。サイズはチャンネル内の値の数とは無関係です。

ポインタのコピーはチャネルのコピーと同じコストなので、チャネルへのポインタを使用してコピーを減らすことはありません。

0

Goでは、値ではなく参照によって渡される値の5つのカテゴリがあります。これらはポインタ、スラ​​イス、マップ、チャネル、インタフェースです。

リファレンス値のコピーとポインタのコピーは、CPUが実際に行う必要がある(少なくとも適切な近似として)とみなされるべきです。

マップへのポインタを使用することはめったにないように、チャネルへのポインタを使用することはほとんど役に立ちません。

あなたのチャンネルはマップを運ぶので、チャンネルは参照タイプであり、マップもあります。そのため、CPUが実行しているのはヒープの周りにポインタをコピーすることです。チャンネルの場合は、ゴルーチンの同期もします。

さらに読むには、Effective Goを開き、ページで「reference」という単語を検索してください。

+2

"参照によって渡される5つのカテゴリの値" ---実際には、Goのすべてが値渡されます。 https://golang.org/doc/faq#pass_by_value "Cファミリのすべての言語と同様に、Goのすべてが価値によって渡されます。 – zerkms

+0

はい、それは本当に、おそらく私は過度に単純化していました。5つのカテゴリはすべて参照型であり、参照のコピー(または参照パラメータの渡し)は参照するものをコピーしません。すべてが価値によって渡されたということは、異なる意味で過度の単純化であると主張するかもしれない。渡されたパラメータに加えた変更が、その値の範囲を超えた影響を受けるかどうかを理解する必要があります。 –

関連する問題