深入理解Go语言中的可比较数据类型
package main
import (
"fmt"
"reflect"
)
// 定义一个函数,用于比较两个interface{}类型的值是否相等
func compareValues(a, b interface{}) bool {
if a == nil || b == nil {
return a == b
}
aValue := reflect.ValueOf(a)
bValue := reflect.ValueOf(b)
if aValue.Type() != bValue.Type() {
return false
}
// 使用reflect.DeepEqual来进行深度比较
return reflect.DeepEqual(a, b)
}
func main() {
// 测试compareValues函数
// 基本类型
fmt.Println(compareValues(10, 10)) // true
fmt.Println(compareValues(10, "10")) // false
// 切片
fmt.Println(compareValues([]int{1, 2}, []int{1, 2})) // true
fmt.Println(compareValues([]int{1, 2}, []int{2, 1})) // false
// 结构体
type testStruct struct {
Field1 int
Field2 string
}
fmt.Println(compareValues(testStruct{1, "a"}, testStruct{1, "a"})) // true
fmt.Println(compareValues(testStruct{1, "a"}, testStruct{2, "a"})) // false
// 字典
fmt.Println(compareValues(map[string]int{"key": 1}, map[string]int{"key": 1})) // true
fmt.Println(compareValues(map[string]int{"key": 1}, map[string]int{"key": 2})) // false
}
这段代码定义了一个compareValues
函数,用于比较两个interface{}
类型的值是否相等。它首先检查nil情况,然后获取两个值的reflect.Value
,检查它们的类型是否相同,最后使用reflect.DeepEqual
来进行深度比较。代码中包含了基本类型、切片、结构体和字典的比较示例,展示了如何使用反射包来进行复杂数据结构的比较。
评论已关闭