2017-12-20 7 views
-3

I、次のコードを有する:追加データをマップする[文字列]インターフェイス{}

package main 

import (
    "sync" 
    "fmt" 
) 

var dataSet = struct { 
    sync.RWMutex 
    data map[string]interface{} 
}{data: make(map[string]interface{})} 

func main() { 
    dataSet.Lock() 
    defer dataSet.Unlock() 
    d := dataSet.data 

    test := []string{"one", "two", "three"} 
    m := map[string]int{ 
     "one": 1, 
     "two": 2, 
     "three": 3, 
    } 
    for _, t := range test { 
     d["data"] = map[string]interface{}{ 
      "test" : m["one"], 
      "more": 1, 
      t: map[string]int{ 
       "lvl2": 2, 
      }, 
     } 
    } 
    fmt.Println(dataSet.data["data"]) 
} 

この可能ですか?

助けてくれてありがとう、私は上記のコードを更新しました。 私はむしろゴランの新人です。これらのネストマップのいくつかは混乱しています。

fmt.Println(dataSet.data["data"]) 

戻り

map[test:1 more:1 three:map[lvl2:2]] 

は、どのように私はそれがすべて3つのマップであることを得るのですか?

fmt.Println(dataSet.data["data"].(map[string]interface{})["three"] 

戻り

map[lvl2:2] 

しかし

fmt.Println(dataSet.data["data"].(map[string]interface{})["three"] 

戻り

<nil> 

は、どのように私は、テストのすべての項目が追加されているのですか?


ありがとうございました!

最終的な解決策:https://play.golang.org/p/bRZXye649fY

package main 

import (
    "fmt" 
    "sync" 
) 

var dataSet = struct { 
    sync.RWMutex 
    data map[string]interface{} 
}{data: make(map[string]interface{})} 

func main() { 
    dataSet.Lock() 
    defer dataSet.Unlock() 
    d := dataSet.data 

    test := []string{"one", "two", "three"} 
    m := map[string]int{ 
     "one": 1, 
     "two": 2, 
     "three": 3, 
    } 

    for i, t := range test { 

     dt := map[string]interface{}{ 
      "test": m["one"], 
      "more": 1, 
      t: map[string]interface{}{ 
       "i": i, 
      }, 
     } 

     // If not set, just use it 
     if d["data"] == nil { 
      d["data"] = dt 
      continue 
     } 

     // Otherwise we want to merge new data in 
     dm := d["data"].(map[string]interface{}) 
     for k, v := range dt { 
      dm[k] = v 
     } 

    } 
    fmt.Println(dataSet.data["data"].(map[string]interface{})["two"]) 
    fmt.Println(dataSet.data["data"]) 
} 
+0

はい。やってみました?あなたはどんな問題に遭遇しましたか? – Adrian

+0

申し訳ありませんが、実際のコードに似ているようにコードを更新しました。 – caboose0013

+0

エラーは正確です。あなたはそのブロックがどんなタイプであるかを伝えなければなりません。たぶん 'map [string] interface {} {...}'? – Adrian

答えて

1

それは、(マップの値は文字通り何もすることができinterface{}ある)あなたが挿入しようとしているもののデータタイプあなたの質問から明らかではないが、ここで何を推測です目指しされることがあります。複合リテラルを指定するとき

for _, t := range test { 
    d["data"] = map[string]interface{}{ 
     "test" + t: m["one"], 
     "more": 1, 
     "t": map[string]int{ 
      "lvl2": 2, 
     }, 
    } 
} 

基本的に、あなたはそのタイプを指定する必要があり、複数回線リテラルでは、各行は、コンマで終了する必要があります。 the tourおよびthe specを参照してください。

関連する問題