为了账号安全,请及时绑定邮箱和手机立即绑定

Go:在类型 switch 中将任何 int 值转换为 int64

Go:在类型 switch 中将任何 int 值转换为 int64

Go
慕村225694 2021-06-18 18:15:08
我经常遇到这样的情况,我期望一个int(任何类型的int/int8/16/32/64)并使用类型开关检查它switch t := v.(type) {  case int, int8, int16, int32, int64:    // cast to int64  case uint, uint8, uint16, uint32, uint64:    // cast to uint64}现在我不能使用直接转换,因为t在这种情况下将是interface{}. case对于每种整数类型,我真的必须将其拆分为s 吗?我知道我可以通过反射使用 来做到这一点reflect.ValueOf(v).Int(),但不应该有更好的(不那么冗长)的方式来做到这一点吗?更新:提出了一个问题,Rob 建议只reflect在这种情况下使用。
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

在没有更多上下文的情况下很难给您意见,但看起来您试图使您的实现过于通用,这对于主要使用更动态语言或具有通用支持的人来说很常见。

学习围棋过程的一部分是学习接受它的类型系统,这取决于你来自哪里,它可能具有挑战性。

通常,在 Go 中,您希望支持一种可以容纳您需要处理的所有可能值的类型。在您的情况下,它可能是 int64。

例如,看看 math 包。它仅适用于 int64,并希望任何使用它的人都能正确地对其进行类型转换,而不是尝试转换所有内容。

另一种选择是使用类型不可知的接口,就像 sort 包一样。基本上,任何特定于类型的方法都将在您的包之外实现,并且您希望定义某些方法。

学习和接受这些属性需要一段时间,但总的来说,最终证明它在可维护性和健壮性方面是好的。接口确保您具有正交性,强类型确保您可以控制类型转换,这最终会导致错误以及内存中不必要的副本。

干杯


查看完整回答
反对 回复 2021-06-21
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

你想解决什么问题?您描述的完整解决方案如下所示:


func Num64(n interface{}) interface{} {

    switch n := n.(type) {

    case int:

        return int64(n)

    case int8:

        return int64(n)

    case int16:

        return int64(n)

    case int32:

        return int64(n)

    case int64:

        return int64(n)

    case uint:

        return uint64(n)

    case uintptr:

        return uint64(n)

    case uint8:

        return uint64(n)

    case uint16:

        return uint64(n)

    case uint32:

        return uint64(n)

    case uint64:

        return uint64(n)

    }

    return nil

}


func DoNum64Things(x interface{}) {

    switch Num64(x).(type) {

    case int64:

        // do int things

    case uint64:

        // do uint things

    default:

        // do other things

    }

}


查看完整回答
反对 回复 2021-06-21
  • 3 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信