Go 1.18 今天推出了,其中一個最大的更新莫過於是 Generics。
在 Generics 中有個名為 comparable
的 type,在官方更新文件中對它的解釋是這樣的:
The new predeclared identifier comparable is an interface that denotes the set of all types which can be compared using == or !=. It may only be used as (or embedded in) a type constraint.
bool
, int
, float
, complex
, string
interface
, chan
, Pointerstruct
和 array
需要所有 member 都是 comparable
類型,才可以 comparable
func isEqual(T comparable)(a T, b T) bool {
return a == b
}
isEqual(1, 2) // true
isEqual("123", "123") // true
isEqual("123", "234") // false
type Person struct {
Name string
}
isEqual(
Person{Name: "foo"},
Person{Name: "foo"},
) // true
以下類型都不是 comparable
的:
slice
map
func
但是其中有一個例外是 error
類型,雖然在 Go 裡面平常是可以用 ==
或 !=
來比較 error
:
if errors.New("err") == errors.New("err") {
print("equal")
}
// output: equal
但是 error
不屬於 comparable
,因此如果這樣寫的話將會編譯錯誤。
isEqual(errors.New("err"), errors.New("err"))
// ❌ error does not implement comparable
另外,就算在 struct
之中含有 error
的 field,也一樣會有錯誤。
type Person struct {
Name string
Error error // not comparable
}
isEqual(
Person{Name: "foo"},
Person{Name: "foo"},
)
// ❌ Person does not implement comparable