今天在github上看到一个项目里面list的一个Contains方法.
func (list *List) Contains(values ...interface{}) bool {
for _, searchValue := range values {
found := false
for _, element := range list.elements {
if element == searchValue {
found = true
break
}
}
if !found {
return false
}
}
return true
}
我之前对两个interface判定是否相等都是先做类型断言,然后转换成具体的类型再判定是否相等。这里直接做“element == searchValue”会不会有什么问题?另外,如果实现了接口T的类型X的值一个x,和接口T的值t用“==”比较是否可行呢?
非常感谢。我再次翻看了文档,找到了比较操作符的说明。贴在下面以供学习。
在任何比较中,第一个操作数必须为可赋予第二个操作数的类型,反之亦然。
相等性操作符 == 和 != 适用于可比较操作数。 顺序操作符 <、<=、> 和 >= 适用于有序的操作数。这些比较操作的关系和值定义如下:
1、布尔值之间可比较。若两个布尔值同为 true 或同为 false,它们即为相等。
2、通常情况下,整数值之间可比较或排序。
3、根据 IEEE-754 标准的定义,浮点数值之间可比较或排序。
4、复数值之间可比较。对于两个复数值 u 与 v, 若 real(u) == real(v) 且 imag(u) == imag(v),它们即为相等。
5、根据按字节词法,字符串值之间可比较或排序。
6、指针值之间可比较。若两个指针指向相同的值或其值同为 nil,它们即为相等。 指向明显为零大小变量的指针可能相等也可能不相等。
7、信道值可比较。若两个信道值通过相同的 make 调用 (§创建切片、映射和信道)创建或同为 nil 值,它们即为相等。
8、接口值可比较。若两个接口值拥有相同的动态类型与相等的动态值,或同为 nil 值,它们即为相等。
9、当非接口类型 X 的值可比较且 X 实现了 T 时, 非接口类型 X 的值 x 与接口类型 T 的值 t 则可比较。 若 t 的动态类型与 X 相同且 t动态值等于 x,它们即为相等。
10、若两个结构值的所有字段可比较,它们即可比较。若其相应的非空白字段相等,它们即为相等。
11、若两个数组元素类型的值可比较,则数组值可比较。若其相应的元素相等,它们即为相等。
#2
更多评论
这种问题明显应该查spec,golang的spec很短的
https://golang.org/ref/spec
Comparison operators
A value x of non-interface type X and a value t of interface type T are comparable when values of type X are comparable and X implements T. They are equal if t's dynamic type is identical to X and t's dynamic value is equal to x.
#1