2014-11-17 3 views
9

Из источника, на который я не могу повлиять, я получаю данные на карте, которая поступает как map[interface {}]interface {}.Convert map [interface {}] interface {} для отображения строки [string]

Мне нужно обработать содержащиеся данные, желательно как map[string]string (данные в нем вполне подходят).

Мне также нужно сгенерировать список ключей из данных, поскольку они не известны заранее.

Большинство подобных вопросов я мог бы найти в Интернете сказать, более или менее, что это невозможно, но если моя карта m, fmt.Println(m) показывает данные там, читаемым, как map[k0:v0 K1:v1 k2:v2 ... ].

Как я могу сделать то, что может сделать fmt.Println?

+1

конечно данные есть, вы просто нужно перебирать карту. Невозможно напрямую преобразовать эти структуры. – JimB

+1

Возможный дубликат [Тип конвертирования фрагментов интерфейсов в go] (http://stackoverflow.com/questions/12753805/type-converting-slices-of-interfaces-in-go) – JimB

+0

Думаю, мне нужно перезагрузить. Карта, которую я получаю, отказывается от повторения, в то время как ответ @Swoogan работает отлично. – user3160501

ответ

10

Возможно, я неправильно понял вопрос, но будет ли это работать?

m := make(map[interface{}]interface{}) 
m["foo"] = "bar" 

m2 := make(map[string]string) 

for key, value := range m {   
    switch key := key.(type) { 
    case string: 
     switch value := value.(type) { 
     case string: 
      m2[key] = value 
     } 
    } 
} 
+4

FYI, вы можете назначить в инструкции switch, так что вам не нужно этого делать так: http://play.golang.org/p/-ZeUXTKu9a – JimB

+0

Право, должно быть, пропустили это в я спешу ответить. Благодаря! – Swoogan

+0

Спасибо! Это то, что я пытался вначале, но не удалось. Ваш пример действительно работает, а «моя» карта отказывается от диапазона из-за интерфейса типа {}. Оба они отображаются как «интерфейс [интерфейс {}] {}« путем отражения. TypeOf, но ведут себя по-другому .... ???? – user3160501

0

// data is map[string]interface{} 
 

 
form := make(map[string]string) 
 

 
for k, v := range data { 
 
    form[k] = v.(string) 
 
}

0

Безопасный способ обработки неизвестных интерфейсов, просто используйте fmt.Sprintf()

https://play.golang.org/p/gOiyD4KpQGz

package main 

import (
    "fmt" 
) 

func main() { 

    mapInterface := make(map[interface{}]interface{}) 
    mapString := make(map[string]string) 

    mapInterface["k1"] = 1 
    mapInterface[3] = "hello" 
    mapInterface["world"] = 1.05 

    for key, value := range mapInterface { 
     strKey := fmt.Sprintf("%v", key) 
     strValue := fmt.Sprintf("%v", value) 

     mapString[strKey] = strValue 
    } 

    fmt.Printf("%#v", mapString) 
} 
Смежные вопросы