在golang中加入地图键

在golang中加入地图键,go,Go,我想把一个映射的所有键合并成一个字符串,格式为[k1,k2,…]。我不太关心顺序,只是我可以制作字符串。我知道有函数strings.Join(),但它接受[]字符串,而不是map[string]bool 我希望以最高效/最快的方式完成这项工作(即,我不希望创建一个完整的密钥副本,这样我就可以对其进行切片)。我找不到一种方法来获取地图关键点的一部分,所以我使用了下面的函数。显然,它不是最好的,因为它做了不必要的写入和trunc 有没有一种方法可以直接在地图关键点上切片 func CreateStr

我想把一个映射的所有键合并成一个字符串,格式为[k1,k2,…]。我不太关心顺序,只是我可以制作字符串。我知道有函数
strings.Join()
,但它接受
[]字符串,而不是
map[string]bool

我希望以最高效/最快的方式完成这项工作(即,我不希望创建一个完整的密钥副本,这样我就可以对其进行切片)。我找不到一种方法来获取地图关键点的一部分,所以我使用了下面的函数。显然,它不是最好的,因为它做了不必要的写入和trunc

有没有一种方法可以直接在地图关键点上切片

func CreateStringArray(myMap map[string]bool) string {
    if myMap == nil || len(myMap) == 0 {
        return "[ ]"
    }

    buf := bytes.NewBufferString("[")

    for k, _ := range myMap {
        buf.WriteString(k)
        buf.WriteString(", ")
    }

    buf.Truncate(buf.Len() - 2)
    buf.WriteString("]")

    return buf.String()
}

大多数时候,我只会写一些明显的代码:

func KeysString(m map[string]bool) string {
    keys := make([]string, 0, len(m))
    for k := range m {
        keys = append(keys, k)
    }
    return "[" + strings.Join(keys, ", ") + "]"
}
如果您需要的是效率而不是可读性,您可以查看的实现,了解如何编写这种最小化副本。这与您的代码之间的主要区别在于,构造了一个长度正好合适的
[]字节
,当缓冲区必须调整大小时,它可以防止数据被复制

func KeysString(m map[string]bool) string {
    if len(m) == 0 {
        return "[]"
    }
    n := 2 * len(m)  // (len-1) commas (", "), and one each of "[" and "]".
    for k := range m {
        n += len(k)
    }
    b := make([]byte, n)
    bp := copy(b, "[")
    first := true
    for k := range m {
        if !first {
            bp += copy(b[bp:], ", ")
        }
        bp += copy(b[bp:], k)
        first = false
    }
    bp += copy(b[bp:], "]")
    return string(b)
}

当然,一定要在使用此函数的代码的上下文中进行分析和优化,以确保可读性折衷是值得的。

老实说,除非分析证明这是一个瓶颈,否则我只会使用普通的“+=”和降片。耶,奇怪的是,没有m.Keys()能够提供给字符串。Join,特别是考虑到你可以
range
在地图上迭代。Go没有太多的语法糖分。它可以分为四行。好吧,这与Golang没有真正的集合这一事实相结合。这意味着python中像“|”.join(set(list))这样简单的东西变成了:创建map[string]struct{},循环填充,创建[]字符串,循环填充,调用strings.join。所以一条线变成了两个环路和10条线。