interface型をint64型に変換したい


下記のようなinterface型の変数`r`をint64型に変換したいのですができません。

[code]

    fmt.Println(r) => [40]
    v := reflect.valueOf(r)
    fmt.Println(v.Type()) => []interface{}
    fmt.Println(v.Kind()) => slice
    
[/code]

これを素直に`a, ok := r.(int64)`としても、スライスなので`a, ok := r.([]int64)`としても変換できませんでした。  
これはどうやって変換すればいいのでしょうか。




スライスの要素を一つ一つ変換していく事になります。

[code]

    a := make([]int64, len(r))
    for i, v := range r {
        switch v.(type) {
        case int64:
            a[i] = v.(int64)
        }
    }
    
    fmt.Println(a)  // => [40]
    
[/code]

ただ、int64 型ではない要素はスキップされますので初期値(0)のままになります。

[code]

    r := []interface{}{int64(40), "foo", 100}
    fmt.Println(a)  // => [40 0 0]
    
[/code]

**追記**

`int64` 型に変換可能な型を持つ要素を全て取り込む場合を追記しておきます。

[code]

    package main
    
    import (
      "fmt"
      "reflect"
    )
    
    func main() {
      r := []interface{}{int64(40), int(1), float64(1.8), int8(100), int16(2000), int32(30000)}
    
      fmt.Println(r)
      vr := reflect.ValueOf(r)
      fmt.Println(vr.Type())
      fmt.Println(vr.Kind())
    
      a := make([]int64, 0, len(r))
      for _, v := range r {
        switch v.(type) {
        case int64:
          a = append(a, v.(int64))
        case int:
          a = append(a, int64(v.(int)))
        case int8:
          a = append(a, int64(v.(int8)))
        case int16:
          a = append(a, int64(v.(int16)))
        case int32:
          a = append(a, int64(v.(int32)))
        }
      }
    
      fmt.Println(a)
    }
    
[/code]

※ float/float32/float64 型の変数も変換できないことはないのですが、整数値に丸められたり(切り捨て)、overflow
を起こす場合もありますので除外しています




スライスの要素を一つ一つ変換していく事になります。

[code]

    a := make([]int64, len(r))
    for i, v := range r {
        switch v.(type) {
        case int64:
            a[i] = v.(int64)
        }
    }
    
    fmt.Println(a)  // => [40]
    
[/code]

ただ、int64 型ではない要素はスキップされますので初期値(0)のままになります。

[code]

    r := []interface{}{int64(40), "foo", 100}
    fmt.Println(a)  // => [40 0 0]
    
[/code]

**追記**

`int64` 型に変換可能な型を持つ要素を全て取り込む場合を追記しておきます。

[code]

    package main
    
    import (
      "fmt"
      "reflect"
    )
    
    func main() {
      r := []interface{}{int64(40), int(1), float64(1.8), int8(100), int16(2000), int32(30000)}
    
      fmt.Println(r)
      vr := reflect.ValueOf(r)
      fmt.Println(vr.Type())
      fmt.Println(vr.Kind())
    
      a := make([]int64, 0, len(r))
      for _, v := range r {
        switch v.(type) {
        case int64:
          a = append(a, v.(int64))
        case int:
          a = append(a, int64(v.(int)))
        case int8:
          a = append(a, int64(v.(int8)))
        case int16:
          a = append(a, int64(v.(int16)))
        case int32:
          a = append(a, int64(v.(int32)))
        }
      }
    
      fmt.Println(a)
    }
    
[/code]

※ float/float32/float64 型の変数も変換できないことはないのですが、整数値に丸められたり(切り捨て)、overflow
を起こす場合もありますので除外しています

