web-dev-qa-db-ja.com

map [interface {}] interface {}をmap [string] stringに変換します

ソースから、私は_map[interface {}]interface {}_として到着するマップ内のデータを与えられます。

できれば_map[string]string_として含まれているデータを処理する必要があります(その中のデータは完全に適切です)。

事前に知られていないため、データからキーのリストも生成する必要があります。

私がウェブ上で見つけることができるほとんどの同様の質問は多かれ少なかれ、これは不可能であると言いますが、私のマップがmである場合、fmt.Println(m)はデータがそこにあり、_map[k0:v0 K1:v1 k2:v2 ... ]_。

Fmt.Printlnでできることはどうすればできますか?

21
user3160501

未知のインターフェースを処理する安全な方法は、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)
}
13
wakumaku

おそらく私は質問を誤解していますが、これはうまくいくでしょうか?

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
        }
    }
}
14
Swoogan
// data is map[string]interface{}

form := make(map[string]string)

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