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