Golang 中国

一个函数的传入参数类型为map[string]inerface{},但我们传进去的是map[string]string 就会出现cannot use data (type map[string]string) as type map[string]interface {}的错误 应该如何解决 map[string]string不能作为map[string]inerface{}传入吗 有什么方法快速转化?

7 回复
stevewang
#1 stevewang • 2015-07-20 08:53

map[string]interface{}map[string]string是不同的类型,不能直接转换。

stevewang
#2 stevewang • 2015-07-20 08:55

或者你可以用接口来实现

type Map interface {
    Value(string) interface{}
}

type StringMap map[string]string

func (m StringMap) Value(key string) interface{} {
    return m[key]
}

func f(m Map) {
    str, ok := m.Value("hello").(string)
    if ok {
        fmt.Println(str)
    }
}

func main() {
    m := map[string]string{}
    m["hello"] = "world"
    f(StringMap(m))
}
stevewang
#3 stevewang • 2015-07-20 09:15

如果要支持遍历,就稍微复杂一些:

import (
    "fmt"
)

type Map interface {
    Value(string) interface{}
    Next() (string, interface{}, bool)
}

type StringMap struct {
    m     map[string]string
    keys  []string
    index int
}

func NewStringMap(m map[string]string) *StringMap {
    keys := make([]string, len(m))
    i := 0
    for k, _ := range m {
        keys[i] = k
        i++
    }
    return &StringMap{
        m:     m,
        keys:  keys,
        index: 0,
    }
}

func (m *StringMap) Value(key string) interface{} {
    return m.m[key]
}

func (m *StringMap) Next() (string, interface{}, bool) {
    if m.index >= len(m.keys) {
        return "", nil, false
    }
    key := m.keys[m.index]
    m.index++
    return key, m.m[key], true
}

func f(m Map) {
    for {
        k, v, ok := m.Next()
        if !ok {
            break
        }
        fmt.Printf("%s=%v\n", k, v)
    }
}

func main() {
    m := map[string]string{}
    m["hello"] = "world"
    f(NewStringMap(m))
}
sneermorn
#4 sneermorn • 2015-07-20 09:45

多谢大神的指点!!膜拜~~

qingo
#5 qingo • 2015-10-08 00:33

我也请教,map[string]inerface{}怎样转ch成map[string]string

zhuchaokn
#6 zhuchaokn • 2018-07-02 09:15

简单遍历转换就好了吧,为啥要搞的这么复杂?

package main

import "fmt"

func mapInterface(m map[string]interface{}) {
    for key, v := range m {
        fmt.Println(key, ":", v)
    }
}
func main() {
    mapString := map[string]string{
        "abc": "123",
        "def": "456",
    }
    mapInterface(func(m map[string]string) map[string]interface{} {
        mi := map[string]interface{}{}
        for k, v := range m {
            mi[k] = v
        }
        return mi
    }(mapString))
}

这个样子,是不是满足题意?

xxwjj
#7 xxwjj • 2018-12-11 07:13
type Map interface {
    Value(string) interface{}
    Next() (string, interface{}, bool)
}
需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。