【问题标题】:Is there a way to compare with any pointer objects in golang?有没有办法与 golang 中的任何指针对象进行比较?
【发布时间】:2019-02-09 07:13:57
【问题描述】:

我正在尝试制作一个比较器,它接受两个字符串指针或两个整数指针并返回结果。任何指针都可以为 nil,只有当它们具有值且值相等时,我才希望为真。

我试过像

这样的界面
type T *interface{}
func compare(a T,b T) bool

因为我在将 *string 转换为 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 
}

【问题讨论】:

    标签: go


    【解决方案1】:

    鉴于您只使用两种类型,请使用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))
    

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

    【讨论】:

    • 酷,谢谢!它按我的预期工作! :) 还有一件事。有没有办法指定类型?所以 a 和 b 必须具有相同的类型?而不是抛出错误?
    • 哎呀抱歉我不会说 Go.. 我的意思是而不是返回错误 compare() (bool, err) { if a.type() != b.type(){ return nil, error.New() } }
    • 我对您的要求感到困惑。我的答案中显示的两个函数有一个返回值,一个布尔值。这些函数不返回错误。如果这两种类型不同,则函数返回 false。您是要向函数添加错误返回值,还是函数原样良好?
    • 我希望有一种方法可以限制 A 和 B 具有相同的类型。如果 a 和 b 具有不同的类型,它只会返回 false,但我希望如果 a 和 b 具有不同的类型,他们甚至不能调用该方法。
    • 当 a 和 b 的类型不同时,无法阻止应用程序调用该函数。当将不同的类型传递给函数时,您希望发生什么?选择是:返回 false、返回错误或恐慌。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 2021-03-18
    • 2020-07-09
    相关资源
    最近更新 更多