多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
- 切片、映射和通道是不可比较的类型 在 Go 语言中,两个结构体是可以进行比较的,但有一些限制: 1. **相同类型的结构体可以比较:** 两个结构体变量可以进行相等(`==`)或不等(`!=`)比较,但它们的类型必须是相同的,而且字段的类型也要相同。 2. **可比较的结构体:** 如果结构体的所有字段都是可比较的类型,那么这个结构体就是可比较的。可比较的类型包括数值类型、字符、字符串、指针、数组等。 3. **不可比较的结构体:** 如果结构体包含不可比较的字段,比如切片、映射或包含函数字段,那么该结构体就不是可比较的。 ~~~ package main import "fmt" type Point struct { X, Y int } type Circle struct { Center Point Radius int } func main() { p1 := Point{1, 2} p2 := Point{1, 2} p3 := Point{2, 3} // 相同类型的结构体可以进行比较 fmt.Println(p1 == p2) // true fmt.Println(p1 == p3) // false c1 := Circle{Point{0, 0}, 5} c2 := Circle{Point{0, 0}, 5} c3 := Circle{Point{1, 1}, 5} // 结构体可以嵌套,如果所有字段都是可比较的,那么结构体也是可比较的 fmt.Println(c1 == c2) // true fmt.Println(c1 == c3) // false } ~~~ ### 可比较的字段类型 1. **基本类型**: * 布尔类型:`bool` * 整型:`int`, `int8`, `int16`, `int32`, `int64`, `uint`, `uint8`, `uint16`, `uint32`, `uint64`, `uintptr` * 浮点型:`float32`, `float64` * 复数类型:`complex64`, `complex128` * 字符串:`string` * 字符:`byte`, `rune` 2. **指针类型**(指向相同类型的指针可以比较): * `*T` 3. **数组**(元素类型必须也是可比较的): * `[N]T` 4. **结构体**(所有字段类型都必须是可比较的): * `struct{...}` 5. **接口**(两个接口值可以比较,前提是它们的动态类型相同且动态值可比较): * `interface{}` 6. **常量**:所有常量都可以比较。 ### 不可比较的字段类型 1. **切片**: * `[]T` 2. **映射**: * `map[K]V` 3. **函数**: * `func(...) ...` 4. **字典类型**: * `map[...]...` 5. **通道**(在某些情况下可以比较,但结果不太有用): * `chan T` 6. **数组中的不可比较元素类型**: * 例如,`[N][]T`(切片类型的数组)