2013-10-15 5 views
6

のタイプを使用していますが、私は配列から型を取得するにはどうすればよいGolang:任意の配列の型を取得するために、パッケージを反映Iをスライス

prog.go:17: cannot use sample_array1 (type []int) as type []interface {} in function argument [process exited with non-zero status] 

を取得しますか?私はそれを価値から得る方法を知っています。

func GetTypeArray(arr []interface{}) reflect.Type { 
     return reflect.TypeOf(arr[0]) 
    } 

http://play.golang.org/p/sNw8aL0a5f

答えて

4

変更:

GetTypeArray(arr []interface{}) 

へ:

GetTypeArray(arr interface{}) 

ところで、[]intは、配列が、整数のスライスではありません。

+3

これは、潜在的なインデックス範囲外のパニックの問題を解決していません。私の答えを見てください。 – Mike

+0

@Mikeあなたが正しいとはいえ、それは問題ではありません(これは解決すべき非常に具体的なエラーを含んでいます)ので、ここでは範囲外です。 – thwd

+2

質問のタイトルは「Golangは、行く:配列の型を取得する」であり、それは私がそれを見つけたとき、私が探していたものです。私はそれがあなたのバグであるか、あなたがそれを逃したことを示唆していません。しかし、バグに気づかずにこのコードを使用したり、ソリューションが最適でなかったという事実を殆ど使用していたので、解決することが重要です。私はあなたに挑戦しようとしていない、私はそれが重要だと思う。 – Mike

18

あなたはスライスのインデックスを作成しているという事実は、安全でない - それは空の場合は、インデックス範囲外のランタイムパニックを取得します。かかわらず、それが原因でreflect package's Elem() methodの不要だ:@ tomwildeの変更ごとに、引数arrは絶対にどのようなタイプのものとすることができる、ということ

func GetTypeArray(arr interface{}) reflect.Type { 
     return reflect.TypeOf(arr).Elem() 
} 

注:だから

type Type interface { 

    ... 

    // Elem returns a type's element type. 
    // It panics if the type's Kind is not Array, Chan, Map, Ptr, or Slice. 
    Elem() Type 

    ... 
} 

、ここにあなたが使用したいものですしたがって、実行時に非スライス値を受け取り、パニックに陥ることを防ぐことは何もありません。

関連する問題