【问题标题】:How can I create an array that contains unique strings?如何创建包含唯一字符串的数组?
【发布时间】:2016-01-17 08:58:33
【问题描述】:

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

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

【问题讨论】:

    标签: arrays string go slice


    【解决方案1】:

    如果你想要一个独特元素的集合,那就是Set 数据类型。 Go 没有集合数据类型,但你可以使用map[string]bool 来充当集合。

    对于一个“不错”的集合,使用带有bool 值类型的映射(带有true 值)并利用zero value。对于内存占用最小的集合,使用struct{}值类型的映射,因为struct{}类型的值不占用内存;并使用 comma-ok 成语来判断一个值是否在 set / map 中。

    这就是 set 的“漂亮”版本的样子。将您的元素添加到 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
    }
    

    【讨论】:

    • icza,感谢您的回答和语法检查!嗯,我明白了,在 Go 中我需要自己处理 Set 数据类型。你的源代码很清楚。这很容易理解。非常感谢。
    猜你喜欢
    • 2013-09-09
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多