此功能可以通过“地图”实现。
countrySet := map[string]bool{
"US": true,
"JP": true,
"KR": true,
}
但是为了使读者感到轻松,“设置”是必要的数据结构。
countrySet := set[string]{"US", "JP", "KR"}
或仅使用键初始化“地图”。例如:
countrySet := map[string]bool{"US", "JP", "KR"}
golang有支持这种语法的计划吗?
答案 0 :(得分:5)
我不知道这样的计划。
您可以采取哪些措施来简化初始化:
使用一个由一个字母组成的bool
常量:
const t = true
countrySet := map[string]bool{"US": t, "JP": t, "KR": t}
使用循环添加密钥,因此您只需要列出密钥:
countrySet := map[string]bool{}
for _, v := range []string{"US", "JP", "KR"} {
countrySet[v] = true
}
这只有在您有更多元素的情况下才有利可图。
但是您始终可以创建一个辅助函数:
func createSet(es ...string) map[string]bool {
m := map[string]bool{}
for _, v := range es {
m[v] = true
}
return m
}
然后使用它:
countrySet := createSet("US", "JP", "KR")
答案 1 :(得分:3)
计划不支持Go标准库中的所有内容。该计划旨在鼓励开源,独立开发的软件包。例如,众多之一,
import "k8s.io/apimachinery/pkg/util/sets"
包装组具有自动生成的组类型。
答案 2 :(得分:0)
我认为 map[string]bool
是一个不错的选择。另一种选择是
map[string]struct{}
:
package main
import "fmt"
func main() {
s := map[string]struct{}{
"JP": {}, "KR": {}, "US": {},
}
s["UA"] = struct{}{}
if _, ok := s["UA"]; ok {
println("ok")
}
fmt.Println(s)
}
它比 bool
稍微好一点,因为值占用零字节而不是一字节
字节,但使用起来有点尴尬。另一种选择是
fstest.MapFS
:
package main
import (
"fmt"
"testing/fstest"
)
func main() {
s := fstest.MapFS{"JP": nil, "KR": nil, "US": nil}
s["UA"] = nil
if _, ok := s["UA"]; ok {
println("ok")
}
a, e := s.Glob("U*")
if e != nil {
panic(e)
}
fmt.Println(a) // [UA US]
}
这很好,因为您可以对 Set 项目进行模式匹配。