如何将 map[string]interface{} 转换为 map[string]string

How to convert map[string]interface{} to map[string]string

我正在尝试将 map[string]interface{} 转换为 map[string]string,但每当我尝试时,我都会感到恐慌:

package main

import (
    "encoding/json"
)

func main() {
    var doc interface{}
    js := `{ "id": "123", "links": { "self": "/app/123" } }`
    json.Unmarshal([]byte(js), &doc)
    jsonObj, _ := doc.(map[string]interface{})
    myFunc_convert(jsonObj)
}

func myFunc_convert(js map[string]interface{}) {
  links := js["links"].(map[string]string)
  links["hi"] = "foo"
}

func myFunc_noConvert(js map[string]interface{}) {
  links := js["links"]
  links["hi"] = "foo"
}

如果我调用 myFunc_convert 会出现以下错误:

interface conversion: interface {} is map[string]interface {}, not map[string]string

如果我调用 myFunc_noConvert 我得到这个错误:

invalid operation: links["hi"] (type interface {} does not support indexing)

我提前知道链接将是 map[string]string 并且 我需要能够向其中添加项目。有没有我想念的方法?

我考虑过创建一个类型为 map[string]string 的新地图,然后遍历链接中的所有内容并将其转换为字符串类型并将其放入新地图中,但这看起来很笨拙。

有更好的方法吗?

给你:

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

func main() {
    var doc interface{}
    js := `{ "id": "123", "links": { "self": "/app/123" } }`
    if err := json.Unmarshal([]byte(js), &doc); err != nil {
        log.Fatal(err)
    }
    jsonObj, _ := doc.(map[string]interface{})
    links := myFunc(jsonObj)
    links["hi"] = "foo"
    fmt.Printf("%+v\n", links)
}

func myFunc(js map[string]interface{}) map[string]string {
    result := map[string]string{}
    links, ok := js["links"].(map[string]interface{})
    if !ok {
        return result
    }
    for k := range links {
        if v, ok := links[k].(string); ok {
            result[k] = v
        }
    }
    return result
}