2017-12-20 11 views
-3

나는 다음과 같은 코드가 있습니다추가 데이터를 매핑하는 [문자열] 인터페이스 {}

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 tourthe spec을 참조하십시오.