您的代码中存在多个错误。最严重的是,由于您要将visited
切片的每个特定元素与的 元素进行比较unique
,因此如果unique
包含至少一个不同的元素,最终将附加它。而且,如果由于unique
内部for
循环不会“中断” 而有更多不同的元素,您将最终多次追加它。这是不是你想要的,你要追加相等于元素 的unique
。
还要注意,struct
如果Go中的每个字段都是可比较的,则a in可比较。由于您的visit
结构仅包含2个int
字段,因此具有可比性,因此您可以visit
简单地将type的值与==
运算符进行比较,而不必太丑陋reflect.DeepEqual()
。请参见规格:比较运算符:
如果结构的所有字段都是可比较的,则它们的值是可比较的。如果两个结构值对应的非空白字段相等,则它们相等。
这是适用您逻辑的简化正确版本:
visited := []visit{
visit{1, 100},
visit{2, 2},
visit{1, 100},
visit{1, 1},
}
var unique []visit
for _, v := range visited {
skip := false
for _, u := range unique {
if v == u {
skip = true
break
}
}
if !skip {
unique = append(unique, v)
}
}
fmt.Println(unique)
输出(在Go Playground上尝试):
[{1 100} {2 2} {1 1}]