【问题标题】:Get switch type case to int64 - Golang将开关类型案例转换为 int64 - Golang
【发布时间】:2022-01-24 22:03:36
【问题描述】:

如何将空接口的类型切换到 int64

var vari interface{}
vari = 7466
switch v := vari.(type) {
case int64:
    fmt.Println("integer", v)
default:
    fmt.Println("unknown")
}

这打印未知。 如果我为 int 而不是 int64 这样做,它工作正常(打印“整数 7466”)。如何获得 int64?

【问题讨论】:

  • 换句话说,类型断言(以及类型切换)仅断言值 的类型,而不是您希望的类型。

标签: go type-conversion


【解决方案1】:

文字7466 是一个无类型常量,在这种情况下,它被解释为int,而不是int64。所以要么测试int的案例,要么做:

vari = int64(7466)

这是因为intint64 是不同的类型。

【讨论】:

    【解决方案2】:

    这里有两种情况需要考虑:

    1. 您绝对知道分配给接口的值具有某种已知整数类型。示例:

       var vari interface{}
       vari = 7466 // could be int64|32|16|8(7466)
       v, ok := vari.(int) // or int64|32|16|8
       if !ok {
           fmt.Println("unknown")
           return 0
       }
       return int64(v)
      
    2. 你不知道接口中值的类型是什么。反射包可能会对您有所帮助。 Playground

       func getInt64(v interface{}) (int64, error) {
           switch reflect.TypeOf(v).Kind() {
           case reflect.Int8:
               d, _ := v.(int8)
               return int64(d), nil
           case reflect.Int16:
               d, _ := v.(int16)
               return int64(d), nil
           case reflect.Int32:
               d, _ := v.(int32)
               return int64(d), nil
           case reflect.Int64:
               d, _ := v.(int64)
               return d, nil
           case reflect.Int:
               d, _ := v.(int)
               return int64(d), nil
           // ... tackle uint if needed
           }
      
           return 0, fmt.Errorf("not interger: %v", v)
       }
      

    【讨论】:

      猜你喜欢
      • 2014-02-27
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 2021-06-07
      • 2019-11-27
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      相关资源
      最近更新 更多