【问题标题】:compare two values of different type (but identical underlying type)比较不同类型的两个值(但基础类型相同)
【发布时间】:2019-08-18 12:17:37
【问题描述】:

如何比较具有不同类型但基础类型相同的两个变量的值。

type   SomeID    uint8
type   OtherID   uint8

func areEqual(sid SomeID, oid OtherID) bool {
   // error: mismatched types
   return sid == oid
}

【问题讨论】:

  • 首先将它们转换回uint8,然后比较这些单位。
  • 虽然这确实提出了为什么这些是不同类型的问题;创建基于基元的类型的目的通常是区分它们,这意味着将SomeIDOtherID 进行比较不应产生任何有意义的结果;比如比较一个time.Month和一个time.Weekday,它们都是int,但有不同的含义,因此无法比较。
  • 完全正确 - 通常会向不同类型添加方法,最终定义其独特特征。
  • @Adrian 我同意,但是这是作业的一部分,所以这个问题是虚构的。

标签: go types compare


【解决方案1】:

你可以不那么准确,你不需要记住底层类型

func areEqual(sid SomeID, oid OtherID) bool {
   return sid == SomeID(oid)
}

你可以更通用

func areEqual(x, y interface{}) (bool, error) {
    xv := reflect.ValueOf(x)
    yv := reflect.ValueOf(y)
    if yv.Type().ConvertibleTo(xv.Type()) {
        return xv.Interface() == yv.Convert(xv.Type()).Interface(), nil
    } else {
        return false, errors.New("Types are mismatched")
    }
}

Playground

【讨论】:

    【解决方案2】:

    正如 mkopriva 所说,需要进行类型转换来比较这些值。

    https://tour.golang.org/basics/13

    func areEqual(sid SomeID, oid OtherID) bool {
       return uint8(sid) == uint8(oid)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多