【问题标题】:How to take all keys and values of a map and pass as args to a function in golang?如何获取地图的所有键和值并作为参数传递给golang中的函数?
【发布时间】:2015-11-20 16:48:02
【问题描述】:

我遇到过这样的情况:

先得到一张地图,大小未知

例如:myMap map[string]string

然后,我会将地图的所有键和值作为函数的参数

例如func(key1, key2, ..., value1, value2, ...)

一个示例函数:https://godoc.org/github.com/garyburd/redigo/redis#Script.Do

如何在 go 中实现这一点?

尽可能高效。

任何帮助将不胜感激:)

【问题讨论】:

    标签: dictionary go


    【解决方案1】:

    我们可以使用内置的len()函数查询地图的长度。所以我们可以创建一个足够大的切片来保存所有的键和值。

    之后只需要遍历一次映射就足够了,你可以用键填充切片的前半部分,用值填充切片的后半部分。

    这是尽可能高效的:没有调用内置的append(),我们只迭代地图一次。

    让我们看一个接收键和值的示例函数。这个只是打印所有这些:

    func pairs(keysvalues ...string) {
        for _, s := range keysvalues {
            fmt.Print(s, ", ")
        }
    }
    

    以及创建keysvalues 切片的代码:

    m := map[string]string{
        "a": "A",
        "b": "B",
        "c": "C",
    }
    
    count := len(m)
    all := make([]string, count*2)
    
    i := 0
    for k, v := range m {
        all[i], all[count+i] = k, v
        i++
    }
    

    一旦有了all 切片,就可以像这样调用pairs() 函数:

    pairs(all...)
    

    请注意,尽管地图上的迭代顺序不是确定性的,但它可能会随着迭代而变化。

    示例输出(在Go Playground 上尝试):

    a, b, c, A, B, C, 
    

    注意:

    在您的问题中,您指出所有键都先出现,然后遵循所有值:

    func(key1, key2, ..., value1, value2, ...)
    

    在实践中这种情况很少见,而且通常会列出键值对。工作/处理这个变体要容易得多:

    func pairs(key1, value1, key2, value2, ... keyn, valuen)
    

    如果我们想要生成这个键值对列表,非常相似,它看起来像这样:

    count := len(m)
    all := make([]string, count*2)
    
    i := 0
    for k, v := range m {
        all[i], all[i+1] = k, v
        i += 2
    }
    

    【讨论】:

    • 是的,这种订单很少见,但我必须这样做。 redis 的 lua 脚本采用这样的参数。谢谢,很好用
    【解决方案2】:

    例如,

    package main
    
    import "fmt"
    
    func fn(args ...string) { fmt.Println(args) }
    
    func main() {
        m := map[string]string{"k1": "v1", "k2": "v2"}
        args := make([]string, 0, 2*len(m))
        for key, value := range m {
            args = append(args, key)
            args = append(args, value)
        }
        fmt.Println(args)
        fn(args...)
    }
    

    输出:

    [k1 v1 k2 v2]
    [k1 v1 k2 v2]
    

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 2021-03-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多