在golang中,是否有不使用for循环将map[string]string转换为map[string]interface{}的方法?

4
尝试使用以下片段将 golang 中的 map[string]string 对象转换为 map[string]interface{} 时,我遇到了错误。
package main

import "fmt"

func main() {
    var m = make(map[string]string)
    
    m["a"] = "b"
    
    m1 := map[string]interface{}(m)
    fmt.Println(m1)
}


我得到了这样的错误信息:

我得到了这样的错误信息:

# example
./prog.go:10:30: cannot convert m (type map[string]string) to type map[string]interface {}

我能使用长for循环解决方案来转换这个问题,以下是代码,但我想知道是否有更简单的方法。
package main

import (
    "fmt"
)

func main() {
    m := map[string]string{
        "a": "a",
        "b": "b",
    }

    m2 := make(map[string]interface{}, len(m))
    for k, v := range m {
        m2[k] = v
    }
    
    fmt.Println(m2) 
}


4
不行。在Golang中,使用循环是最简单、最符合惯用法的方法,无法避免。可以通过循环将map[string]string转换为map[string]interface{}。 - mkopriva
5
请查看FAQ中的这个条目,它是关于切片的,但同样适用于映射。 - mkopriva
感谢@mkopriva的澄清和参考。 - Ruchit Patel
2个回答

9
在Go中,没有“cast”这一概念,只有类型转换。因此,最好的方式是使用循环,然后将字符串转换为接口类型。

-4

你可以通过 JSON 进行往返转换:

package main

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

func transcode(in, out interface{}) {
   buf := new(bytes.Buffer)
   json.NewEncoder(buf).Encode(in)
   json.NewDecoder(buf).Decode(out)
}

func main() {
   m := map[string]string{"a": "b"}
   n := make(map[string]interface{})
   transcode(m, &n)
   fmt.Println(n) // map[a:b]
}

https://golang.org/pkg/encoding/json


2
它能正常工作,但这是一个可怕的想法。使用循环执行会更有效率,而且更容易编写。 - user4466350
1
json包在底层使用了反射。因此,如果想要创建一个通用的映射转换器,最好直接使用反射。针对特定的转换,静态类型循环是最好的选择。 - colm.anseo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接