检查地图在Go中是否有重复值

检查地图在Go中是否有重复值,go,Go,考虑下面的地图 mymap := make(map[string]string) mymap["a"] = "one" mymap["b"] = "two" mymap["c"] = "one" 如何确定这些值是否唯一 一种策略是遍历映射,创建一个值片段。然后遍历切片以查找重复项。有更好的方法吗?如果您只需要判断是否存在重复项,而不需要知道哪些值是重复项或有多少重复项,那么跟踪现有值的最有效结构是带有空结构值的映射 请参阅(为方便起见粘贴在下面): 表示存在重复值的false为true。我习惯

考虑下面的地图

mymap := make(map[string]string)
mymap["a"] = "one"
mymap["b"] = "two"
mymap["c"] = "one"
如何确定这些值是否唯一


一种策略是遍历映射,创建一个值片段。然后遍历切片以查找重复项。有更好的方法吗?

如果您只需要判断是否存在重复项,而不需要知道哪些值是重复项或有多少重复项,那么跟踪现有值的最有效结构是带有空结构值的映射

请参阅(为方便起见粘贴在下面):


表示存在重复值的false为true。我习惯于在python中使用set,然后检查长度。但golang不支持集合。您可以将地图用作集合
map[string]struct{}
将是最有效的
string
set类型,因为空结构值将不占用内存。请解释struct{}{}的含义。这是匿名空结构类型的文本。要解决这个问题,您可能熟悉类似于
typemystruct struct{myfieldstring};x:=myStruct{myField:“foo”}
。空结构是一种没有字段的结构类型,因此您也可以想象类似于
type emptyStruct struct{};x:=emptyStruct{}
。我不需要创建一个显式命名的
emptyStruct
struct,我可以内联类型,在这种情况下它将是匿名的(即它没有名称),比如:
x:=struct{}
。您也可以使用非空结构执行此操作,例如
x:=struct{myField string}{myField:“foo”}
package main

import (
    "fmt"
)

func hasDupes(m map[string]string) bool {
    x := make(map[string]struct{})

    for _, v := range m {
        if _, has := x[v]; has {
            return true
        }
        x[v] = struct{}{}
    }

    return false
}

func main() {
    mapWithDupes := make(map[string]string)
    mapWithDupes["a"] = "one"
    mapWithDupes["b"] = "two"
    mapWithDupes["c"] = "one"

    fmt.Println(hasDupes(mapWithDupes)) // prints true

    mapWithoutDupes := make(map[string]string)
    mapWithoutDupes["a"] = "one"
    mapWithoutDupes["b"] = "two"
    mapWithoutDupes["c"] = "three"

    fmt.Println(hasDupes(mapWithoutDupes)) // prints false
}