为了账号安全,请及时绑定邮箱和手机立即绑定

在 golang 中加入地图键

在 golang 中加入地图键

Go
梦里花落0921 2021-09-10 16:50:20
我想将地图的所有键连接成 [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()}
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

大多数情况下,我只会编写明显的代码:


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)

}

当然,请务必在您使用此函数的代码的上下文中进行分析和优化,以确保可读性权衡确实值得。


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信