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

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)

icz*_*cza 6

如果需要一组唯一元素,那就是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)

  • icza,感谢您的回答和语法检查!嗯,我明白了,我明白我需要在 Go 中自己处理 Set 数据类型。你的源代码很清楚。这很容易理解。非常感谢。 (2认同)