在 golang 中加入地图键

我想将地图的所有键连接成 [k1, k2, ...] 形式的单个字符串。我不太关心订单,只是我可以制作字符串。我知道有这个函数,strings.Join()但它接受 a[]string而不是 a map[string]bool。


我想以最有效/最快的方式执行此操作(即我不想创建密钥的完整副本,以便我可以对其进行切片)。我找不到只获取地图键的一部分的方法,所以我想出了以下函数。显然它不是最好的,因为它做了不必要的写入和截断。


有没有办法只对地图键进行切片?


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()

}


梦里花落0921
浏览 169回答 1
1回答

江户川乱折腾

大多数情况下,我只会编写明显的代码: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, ", ") + "]"}如果您需要效率而不是可读性,您可以查看 的实现strings.Join以了解如何编写这种最小化副本。这与您的代码之间的主要区别在于,[]byte构造了长度完全正确的a以防止在缓冲区必须调整大小时复制数据,因为结果正在建立。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)}当然,请务必在您使用此函数的代码的上下文中进行分析和优化,以确保可读性权衡确实值得。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go