标题:结构体(struct)的比较
package main
import "fmt"
func main() {
sn1 := struct {
age int
name string
}{age: 11, name: "qq"}
sn2 := struct {
age int
name string
}{age: 11, name: "qq"}
if sn1 == sn2 {
fmt.Println("sn1 == sn2")
}
sm1 := struct {
age int
m map[string]string
}{age: 11, m: map[string]string{"a": "1"}}
sm2 := struct {
age int
m map[string]string
}{age: 11, m: map[string]string{"a": "1"}}
fmt.Println(sm1, sm2)
//if sm1 == sm2 { //错误的不可比较的(该结构体中包含有切片)
// fmt.Println("sm1 == sm2")
//}
}
解释:
在 Go 中,结构体类型可以进行比较,但有一些限制。结构体比较是按字段逐一比较的,即结构体中的每个字段都会被比较。两个结构体相等的条件是它们的对应字段相等。
以下是结构体比较的规则:
- 结构体必须属于相同的类型。
- 结构体的字段类型必须是可比较的类型,例如整数、浮点数、字符串、指针等。不可比较的类型包括切片、映射和函数等。
- 结构体的字段的名字和类型必须完全相同,字段的顺序也必须相同。
比较两个结构体是否相等可以使用 ==
运算符。如果两个结构体的字段逐一相等,则它们被认为是相等的。例如:
type Point struct {
X, Y int
}
p1 := Point{1, 2}
p2 := Point{1, 2}
p3 := Point{2, 3}
fmt.Println(p1 == p2) // true,p1 和 p2 的字段逐一相等
fmt.Println(p1 == p3) // false,p1 和 p3 的字段不相等
在上面的示例中,p1
和 p2
结构体的字段逐一相等,所以它们被认为是相等的。
请注意,如果结构体包含不可比较的字段,比较操作将引发编译错误。在这种情况下,你需要自定义比较函数来比较结构体。