17876


下記のような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)`としても変換できませんでした。  
これはどうやって変換すればいいのでしょうか。


CC BY-SA 3.0
2015-10-21T00:07:21.273
17873
2015-10-21T11:21:18.580
7232
question
go
interface型を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
を起こす場合もありますので除外しています


CC BY-SA 3.0
2015-10-21T00:48:13.973
17876
2015-10-21T11:21:18.580
2015-10-21T11:21:18.580
17873
answer


この方法でいかがでしょうか？  
<https://play.golang.org/p/c413UEvofS>

[code]

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        r := []interface{}{40}
        fmt.Println(r)          // [40]
        v := reflect.ValueOf(r)
        fmt.Println(v.Type())       // []interface {}
        fmt.Println(v.Kind())       // slice
    
        v2 := reflect.ValueOf(r[0])
        fmt.Println(v2.Type())      // int
        fmt.Println(v2.Kind())      // int
    
        v3 := reflect.ValueOf(int64(r[0].(int)))
        fmt.Println(v3.Type())      // int64
        fmt.Println(v3.Kind())      // int64
    }
    
[/code]


CC BY-SA 3.0
2015-10-21T00:50:46.063
17877
2015-10-21T00:50:46.063
7266
17873
answer