【问题标题】:How to return key's value of a map of type empty interface如何返回空接口类型映射的键值
【发布时间】:2020-04-16 13:18:20
【问题描述】:

我采用了像var u = make(map[string]interface{}) 这样的变量,这意味着一个键可以保存一个字符串/整数或另一个映射。

当我执行以下操作时,它会给出错误cannot use v (type interface {}) as type string in return argument: need type assertion,这看起来很明显,因为通用地图不知道它应该搜索什么。我该如何解决这个问题?代码如下(请注意,目前地图完全是空的)

var u = make(map[string]interface{})

// Get function retrieves the value of the given key. If failed, it returns error.
func Get(k string) (string, error) {
    v, found := u[k]
    println(reflect.Type(v))
    if found {
        v = u[k]
        return v, nil
    }
    return v, errors.New(-1)
}

【问题讨论】:

    标签: go go-map


    【解决方案1】:

    v, found := u[k] 这里 v 是 interface{} 类型

    但是你的函数返回类型是 (string, nil) 你返回的是 (v, nil) 或 (interface{}, nil)。

    interface{}不能自动转成字符串,需要类型断言。

    data, ok := v.(string)
    

    您也可以返回interface{},消费者可以决定要转换的类型。

    【讨论】:

    • 啊。好的,现在我明白了。由于映射可以包含字符串或任何内容,所以最好返回一个interface,然后函数的使用者应该弄清楚返回值的类型是字符串、接口还是其他类型并相应地使用?跨度>
    • 是的,您也可以返回接口{},消费者可以决定将转换哪种类型
    【解决方案2】:

    我不确定你的问题是什么。但是您收到此错误是因为您试图将interface{} 作为具体类型string 返回。如果你想返回字符串,并且你确定 map 的值总是字符串(那你为什么使用map[string]interface{} 而不是map[string]string?)你可以通过使用类型断言来获得底层接口类型:

    s, ok := v.(string)
    

    【讨论】:

    • 现在我明白了。由于映射可以包含字符串或任何内容,所以最好返回一个interface,然后函数的使用者应该弄清楚返回值的类型是字符串、接口还是其他类型并相应地使用?跨度>
    • @Volatil3 是的,这将是一个很好的解决方案,把它留给消费者
    猜你喜欢
    • 2019-10-22
    • 2021-02-03
    • 2021-08-11
    • 2019-01-05
    • 2015-04-05
    • 2017-08-08
    • 2020-09-04
    • 1970-01-01
    • 2022-08-13
    相关资源
    最近更新 更多