有没有办法与golang中的任何指针对象进行比较?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法与golang中的任何指针对象进行比较?相关的知识,希望对你有一定的参考价值。
我正在尝试制作一个比较器,它接受两个字符串指针或两个整数指针并返回结果。任何指针都可以是nil,只有当它们的值和值相等时我才想要真。
我尝试使用界面
type T *interface{}
func compare(a T,b T) bool
因为我必须在将*字符串转换为T时检查nil,这是没用的。
我期待把功能称为
var a *string
var b *string
if compare(a, b){
// do something
}
要么
var a *string
var b *string
if a.equal(b){
// do sth
}
答案
鉴于您只使用两种类型,使用type assertions获取具体指针类型并进行比较:
func compare(a interface{}, b interface{}) bool {
switch a := a.(type) {
case *string:
b, _ := b.(*string)
return a != nil && b != nil && *a == *b
case *int:
b, _ := b.(*int)
return a != nil && b != nil && *a == *b
default:
return false
}
}
以下是调用函数的一些示例:
a := "hello"
b := "world"
c := "hello"
fmt.Println(compare(&a, nil))
fmt.Println(compare(nil, &a))
fmt.Println(compare(&a, &b))
fmt.Println(compare(&a, &a))
fmt.Println(compare(&a, &c))
使用reflect API比较所有可比类型:
func compare(a interface{}, b interface{}) bool {
if a == nil && b == nil {
return true
}
if a == nil || b == nil {
return false
}
va := reflect.ValueOf(a)
vb := reflect.ValueOf(b)
if va.Type() != vb.Type() {
return false
}
if va.Kind() == reflect.Ptr {
if va.IsNil() || vb.IsNil() {
return false
}
va = va.Elem()
vb = vb.Elem()
}
if !va.Type().Comparable() {
return false
}
return va.Interface() == vb.Interface()
}
以上是关于有没有办法与golang中的任何指针对象进行比较?的主要内容,如果未能解决你的问题,请参考以下文章