小编典典

如何创建包含唯一字符串的数组?

go

我想创建一个包含唯一字符串的数组。我怎样才能做到这一点?

var paths = make([]string, 0)

func main() {
    // Members are added dynamically
    paths = append(paths, "aaa")
    paths = append(paths, "bbb")
    paths = append(paths, "bbb")
    paths = append(paths, "ccc")

    // convert ["aaa", "bbb", "bbb", "ccc"] -> ["aaa", "bbb", "ccc"] 
    // or can I use some class that disallow the same string automaticaly?
}

阅读 269

收藏
2020-07-02

共1个答案

小编典典

如果要收集唯一元素,则为Set数据类型。Go没有集合数据类型,但是您可以使用map[string]bool来充当集合。

对于“好的”集合,请使用具有bool值类型(带有true值)的映射并利用零值。对于内存占用最小的集合,请使用具有struct{}值类型的映射,因为类型的值不struct{}占用内存;并使用逗号分隔的习惯用法来判断值是否在集合/映射中。

这是set的“不错”版本的样子。代替切片,将元素添加到a map[string]bool作为键,将a true作为值:

m := make(map[string]bool)

m["aaa"] = true
m["bbb"] = true
m["bbb"] = true
m["ccc"] = true

要检查集合(地图)中是否已存在某个元素,您可以简单地使用一个索引表达式

exists := m["somevalue"]

这将利用零值,也就是说,如果映射尚未包含元素,则返回值类型的零值(false如果为booltype,则返回零),正确指示该元素不在集合中。

地图中的元素没有固定的顺序。如果您需要保留顺序(例如插入顺序),请使用一个切片(记住该顺序)和一个映射(告诉要添加的元素是否是新元素)。这是最简单的帮助add()函数:

var m = make(map[string]bool)
var a = []string{}

func main() {
    add("aaa")
    add("bbb")
    add("bbb")
    add("ccc")
}

func add(s string) {
    if m[s] {
        return // Already in the map
    }
    a = append(a, s)
    m[s] = true
}
2020-07-02