在golang中有没有一种方法可以和指针对象进行比较?

eh57zj3b  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(118)

我正在尝试做一个比较器,它接受两个字符串指针,或者两个整数指针并返回结果。任何指针都可以是nil,只有当它们有值并且值相等时,我才需要true。
我试着用接口,

type T *interface{}
func compare(a T,b T) bool

字符串
因为我必须检查nil当 *string到T时,它是无用的。
我期待调用函数,如

var a *string
var b *string
if compare(a, b){
  // do something
}


var a *string
var b *string
if a.equal(b){ 
  // do sth 
}

col17t5w

col17t5w1#

使用类型参数编写函数:

func compare[T comparable](a *T, b *T) bool {
    return a != nil && b != nil && *a == *b
}

字符串
下面是一些调用函数的示例:

a := "hello"
b := "world"
c := "hello"
var z *string
fmt.Println(compare(z, z))   // prints false
fmt.Println(compare(&a, z))  // prints false
fmt.Println(compare(z, &a))  // prints false
fmt.Println(compare(&a, &b)) // prints false
fmt.Println(compare(&a, &a)) // prints true
fmt.Println(compare(&a, &c)) // prints true


Run it in the playground的一个。
下面是如何在Go语言1.17及更早版本中编写该函数:
假设您只使用两种类型,请使用类型Assert获取具体的指针类型并进行比较:

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))


Run it in the Playground
使用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()
}

相关问题