Go 可比较类型
分类
在 Go 语言中,可比较类型指的是可以使用相等运算符 ==
和不等运算符 !=
进行比较的类型。可比较类型包括:
- 布尔类型
bool
- 数字类型:整数类型(
int
,int8
,int16
,int32
,int64
,uint
,uint8
,uint16
,uint32
,uint64
)、浮点数类型(float32
,float64
)、复数类型(complex64
,complex128
) - 字符串类型
string
- 指针类型
*T
(T
可比较) - 通道类型
chan T
(T
可比较) - 接口类型
interface{}
(底层类型可比较) - 数组类型
[n]T
(T
可比较,n
为常量表达式) - 结构体类型
struct{...}
(其所有字段均可比较)
注意,如果一个类型包含不可比较的类型,则它本身也不是可比较类型。例如,切片类型 []T
中的元素类型 T
如果不是可比较类型,则切片类型也不是可比较类型。同样,包含不可比较类型的结构体类型也不是可比较类型。
什么情况下interface为可比较的?
在Go语言中,interface类型是可以进行比较的,但需要满足一定的条件才能进行比较。可以比较的interface需要满足以下两个条件:
- 接口值的动态类型相同: 两个interface值可以进行比较的前提是它们的动态类型相同。也就是说,两个interface值都是由相同的具体类型实现的。如果两个interface值的动态类型不同,它们无法进行直接比较。
- 接口值的动态值相等: 接口值的动态值是指interface持有的具体值。两个interface值可以进行比较的另一个前提是它们的动态值相等。在比较时,实际上是在比较接口持有的底层具体值是否相等。
示例:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
var p1, p2 interface{
}
p1 = Person{
Name: "Alice", Age: 30}
p2 = Person{
Name: "Alice", Age: 30}
fmt.Println