【问题标题】:Do Sets exist in Go? (like in Python)Go 中是否存在 Set? (就像在 Python 中一样)
【发布时间】:2011-10-25 21:58:03
【问题描述】:

在 python 中是否有任何类似于 'Set' 的 Go 集合?

替代方案:

  • 有在 Go 中实现 Set 的简单方法吗?
  • 有什么方法可以消除切片中的重复项吗?

【问题讨论】:

    标签: collections set go


    【解决方案1】:

    您可以只拥有一个map[whatevertype]bool 并将值设置为true。您可以将切片中的每个元素添加为映射键,然后使用 range 仅取出唯一的元素。

    package main
    import "fmt"
    func main() {
        m := make(map[string]bool)
        s := make([]string, 0)
        s = append(s, "foo")
        s = append(s, "foo")
        s = append(s, "foo")
        s = append(s, "bar")
        s = append(s, "bar")
        for _, r := range s {
            m[r] = true
        }
        s = make([]string, 0)
        for k, _ := range m {
            s = append(s, k)
        }
        fmt.Printf("%v\n", s)
    }
    

    【讨论】:

    • 我只想补充一点,您实际上可以使用任意类型作为值,因为您不关心它。但是使用bool总是设置为true有一个额外的好处是能够简单地通过索引来测试一个元素是否存在,因为当你索引一个键并且它不存在时,它将返回值类型的零值,这对于布尔值是错误的。
    【解决方案2】:

    我认为map[T]bool 是最好的选择,但另一个选择是 map[T]struct{}:

    package main
    
    func main() {
       { // example 1
          s := make(map[string]struct{})
          s["north"] = struct{}{}
          s["south"] = struct{}{}
          _, ok := s["north"]
          println(ok)
       }
       { // example 2
          s := map[string]struct{}{
             "north": {}, "south": {},
          }
          _, ok := s["north"]
          println(ok)
       }
    }
    

    使用起来并不容易,但如果这对您来说是一个因素,它占用的内存更少。

    【讨论】:

      【解决方案3】:

      目前在 golang 中没有 set 实现。您需要自己做或获得第三方库。这里还有一篇不错的博文:

      http://openmymind.net/2011/7/15/Learning-Go-By-Benchmarking-Set-Implementation

      【讨论】:

        猜你喜欢
        • 2015-10-02
        • 2019-03-13
        • 2019-12-29
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        相关资源
        最近更新 更多