登录
首页 >  Golang >  Go问答

如何在Go中为map[string]interface{}设置键值对?

来源:stackoverflow

时间:2024-03-26 18:36:34 413浏览 收藏

**如何为映射 `map[string]interface{}` 设置键值对?** 本文讨论如何在 Go 中为 `map[string]interface{}` 映射设置键值对。对于单元测试,使用 `map[string]string` 时遇到困难,因为测试要求使用 `map[interface{}]interface{}` 作为参数。文章提供了两种解决方案: * 创建一个帮助程序函数 `createmockinterfacemap`,将 `map[string]string` 转换为 `interfacemap`(`sync.map`)。 * 定义类型 `InterfaceMap` 并使用 `MapConvert` 函数将 `map[string]string` 转换为 `InterfaceMap`。

问题内容

var cache atomic.value

func setrestocache(res *utils.interfacemap) error {
    resmap := res.tointerfacemap()
    val := resmap[constant.key] // constant.key is a constant string
    val, ok := val.(string)
    if !ok {
        return errors.new("type assertion failed")
    }
    someres := model.someres{
        title:    val,
    }
    cache.store(someres)
    return nil
}

关于utils.interfacemap

type interfacemap sync.map

//tointerfacemap
func (im *interfacemap) tointerfacemap() map[interface{}]interface{} {
    iim := make(map[interface{}]interface{})
    m := (*sync.map)(im)
    m.range(func(k, v interface{}) bool {
        iim[k] = v
        return true
    })
    return iim
}

我有一些与上面类似的代码,当我想编写单元测试时遇到问题。

{
        name: "test",
        args: args{
            res: &utils.InterfaceMap{
                // How to assign k,v here
            },
        },
        wantErr: false,
    },

如何给map[interface{}]interface{}分配键、值?

其实是map[string]string,所以我用的是assert,但是传入的参数是map[interface{}]interface{}

我想添加一些 string: string 到映射,以便我可以成功测试代码。


正确答案


在测试文件中创建简单函数以输入 map[string]string 并在函数内部,将这些值写入 sync.map 并将其转换为 interfacemap 类型并返回引用。示例如下。

func createmockinterfacemap(in map[string]string) *utils.interfacemap{
    mockmap := sync.map{}
    for key, value := range in {
        mockmap.store(key, value)
    }

    imap := utils.interfacemap(mockmap)

    return &imap
}
{
    name: "test",
    args: args{
        res: createmockinterfacemap(map[string]string{
            `key1`:`value1`,
            `key2`:`value2`,
        }),
    },
    wanterr: false,
},

要传入 map[interface{}]interface{},需要对其进行这样的定义。

您可以使用类似以下内容将 map[string]string 转换为 map[interface{}]interface{}

func mapconvert(mss map[string]string) map[interface{}]interface{} {
    ifacemap := map[interface{}]interface{}{}
    for k, v := range mss {
        ifacemap[k] = v
    }
    return ifacemap
}

以下是使用类型定义的示例:

type InterfaceMap map[interface{}]interface{}

func MapConvert(mss map[string]string) *InterfaceMap {
    ifaceMap := InterfaceMap{}
    for k, v := range mss {
        ifaceMap[k] = v
    }
    return &ifaceMap
}

这是一个完整的运行示例:

https://play.golang.org/p/UPKqqZnFis-

好了,本文到此结束,带大家了解了《如何在Go中为map[string]interface{}设置键值对?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>