在 golang 中加入映射键
Join map keys in golang
我想将映射的所有键连接成 [k1, k2, ...] 形式的单个字符串。我并不过分关心顺序,只是我可以制作字符串。我知道有函数 strings.Join()
但它接受 []string
而不是 map[string]bool
.
我想以最 efficient/fastest 的方式做到这一点(即我不想创建密钥的完整副本,以便我可以对其进行切片)。我找不到只获取地图键的一部分的方法,所以我想出了以下函数。显然它不是最好的,因为它进行了不必要的写入和截断。
有没有办法只分割地图键?
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, ", ") + "]"
}
如果您需要效率而不是可读性,您可以查看 strings.Join
的实现,了解如何编写这种最小化副本的想法。这与您的代码之间的主要区别在于构造了一个长度完全正确的 []byte
,这可以防止在缓冲区必须调整大小时随着结果的增加而复制数据。
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)
}
当然,请务必在您使用此函数的代码的上下文中进行分析和优化,以确保可读性权衡确实值得。
我想将映射的所有键连接成 [k1, k2, ...] 形式的单个字符串。我并不过分关心顺序,只是我可以制作字符串。我知道有函数 strings.Join()
但它接受 []string
而不是 map[string]bool
.
我想以最 efficient/fastest 的方式做到这一点(即我不想创建密钥的完整副本,以便我可以对其进行切片)。我找不到只获取地图键的一部分的方法,所以我想出了以下函数。显然它不是最好的,因为它进行了不必要的写入和截断。
有没有办法只分割地图键?
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, ", ") + "]"
}
如果您需要效率而不是可读性,您可以查看 strings.Join
的实现,了解如何编写这种最小化副本的想法。这与您的代码之间的主要区别在于构造了一个长度完全正确的 []byte
,这可以防止在缓冲区必须调整大小时随着结果的增加而复制数据。
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)
}
当然,请务必在您使用此函数的代码的上下文中进行分析和优化,以确保可读性权衡确实值得。