我想创建一个包含唯一字符串的数组。我怎样才能做到这一点?
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? }
如果要收集唯一元素,则为Set数据类型。Go没有集合数据类型,但是您可以使用map[string]bool来充当集合。
map[string]bool
对于“好的”集合,请使用具有bool值类型(带有true值)的映射并利用零值。对于内存占用最小的集合,请使用具有struct{}值类型的映射,因为类型的值不struct{}占用内存;并使用逗号分隔的习惯用法来判断值是否在集合/映射中。
bool
true
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,则返回零),正确指示该元素不在集合中。
false
地图中的元素没有固定的顺序。如果您需要保留顺序(例如插入顺序),请使用一个切片(记住该顺序)和一个映射(告诉要添加的元素是否是新元素)。这是最简单的帮助add()函数:
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 }