2017-09-27 12 views
0

この例では、valueというsyncmapのキー "xxxxxxx"に1を格納しようとしています。値の型はインタフェース{}です。だから、私はそれをsyncmap.Mapにするための型アサーションを持っています。これはmmです。次に、新しいエントリをmmに追加します。残念ながら、新しいエントリは、valueに追加されず、mmにしかなりません。 mmのように見えるのはコピーか何かです。私はこの作業をどうやって行うのか分かりません。syncmap.Mapにエントリを追加する方法

具体的には、エントリを追加するためにタイプアサーションを行う必要があることを具体的に示しています。しかし、私は、型アサーションがコピーを作っていると思います。エントリ( "xxxxxxx"、1)がvalueというsyncmapに実際に追加されるように、これを行う方法についてアドバイスできますか?

func Test(name string, m syncmap.Map) { 
     log.Print(name, " ") 
     m.Range(func(key, value interface{}) bool { 
       log.Println(">>", value) 
       mm := value.(syncmap.Map) 
       mm.Store("xxxxxxx", 1) 
       PrintMap(">>>>>>>>>>>>> " + key.(string), value.(syncmap.Map)) 
       return true 
     }) 
     log.Println() 
} 
+1

私はあなた 'syncmap.Map'の種類が何であるか知らないが、チャンスはそれがコピーされるべきではないです。あなたのコードで 'go vet'を実行することから始めます。 – JimB

+0

syncmap.Mapの実装を見て間違っているかどうかは分かりません。 https://play.golang.orgで実行可能な例を作りましょう。 – Peter

+0

これは 'x/sync'リポジトリからの古い' sync.Map'実装です。この場合、あなたはほとんど確実にコピーできませんが、 'vet'はすぐにそれを指摘しなければなりません。 – JimB

答えて

1

内側の地図がコピーであることは間違いありません。マップを永続的に変更するには、ポインタを使用します。

func Test(name string, m *sync.Map) { // make parameter a pointer 
    log.Print(name, " ") 
    m.Range(func(key, value interface{}) bool { 
     mm, ok := value.(*sync.Map) // outer map must also store inner maps as pointers 
     mm.Store("xxxxxxx", 1) 
     return true 
    }) 
    log.Println() 
} 

更新sync.Mapタイプへのポインタを格納するためのメインアウターマップを宣言し、あなたのコードの一部。例:私はsyncmap.Map以来syncパッケージの代わりsyncmapを使用しました

var m sync.Map // outer map 
m.Store("A", &sync.Map{}) 
m.Store("B", &sync.Map{}) 
m.Store("C", &sync.Map{}) 

a, _ := m.Load("A") 
am, _ := a.(*sync.Map) 
am.Store("xxxx", 1) 

ノートは今の標準ライブラリの一部です。

の作業例:https://play.golang.org/p/ib-dfXjPDy

関連する問題