Mai*_*awa 0 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?
}
Run Code Online (Sandbox Code Playgroud)
如果需要一组唯一元素,那就是Set数据类型.Go没有设置数据类型,但您可以使用a map[string]bool作为集合.
对于"nice"集,使用bool值类型(带有true值)的映射并利用零值.对于具有最小内存占用的集合,请使用struct{}值类型的映射作为类型的值不struct{}占用内存; 并使用逗号成语来判断值是否在set/map中.
这是集合的"漂亮"版本的样子.而不是切片将您的元素添加到a map[string]bool作为键,true其值为:
m := make(map[string]bool)
m["aaa"] = true
m["bbb"] = true
m["bbb"] = true
m["ccc"] = true
Run Code Online (Sandbox Code Playgroud)
要检查元素是否已经在集合(map)中,您只需使用索引表达式:
exists := m["somevalue"]
Run Code Online (Sandbox Code Playgroud)
这会利用零值,即如果映射尚未包含元素,则返回值类型的零值,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
}
Run Code Online (Sandbox Code Playgroud)