golang是否有支持集合数据结构的计划?

时间:2018-06-30 09:16:57

标签: dictionary go set

此功能可以通过“地图”实现。

countrySet := map[string]bool{
  "US": true,
  "JP": true, 
  "KR": true,
}

但是为了使读者感到轻松,“设置”是必要的数据结构。

countrySet := set[string]{"US", "JP", "KR"}

或仅使用键初始化“地图”。例如:

countrySet := map[string]bool{"US", "JP", "KR"}

golang有支持这种语法的计划吗?

3 个答案:

答案 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标准库中的所有内容。该计划旨在鼓励开源,独立开发的软件包。例如,众多之一,

  

package sets

     

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 项目进行模式匹配。

https://golang.org/pkg/testing/fstest