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

时间:2015-10-19 05:27:11

标签: arrays string go slice

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

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?
}

1 个答案:

答案 0 :(得分:6)

如果您想要一组唯一元素,那就是Set数据类型。 Go没有设置数据类型,但您可以使用map[string]bool作为集合。

对于" nice"设置,使用bool值类型(带true值)的地图并利用zero value。对于具有最小内存占用量的集合,请使用struct{}值类型的映射,因为struct{}类型的值不占用内存;并使用逗号成语来判断值是否在set / map中。

这里"好看"集的版本看起来像。而不是切片将您的元素添加到map[string]bool作为键,并以true作为值:

m := make(map[string]bool)

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

要检查元素是否已经存在于集合(地图)中,您只需使用index expression

exists := m["somevalue"]

这会利用zero value,即如果地图尚未包含元素,则返回值类型的零值,如果是false类型,则返回bool,正确指示该元素不在集合中。

地图中的元素没有固定的顺序。如果您需要保留订单(例如插入订单),则使用切片(记住订单)和地图(以判断要添加的元素是否为新)。使用帮助器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
}