2017-05-26 7 views
0
fmt.Println(v.Kind()) 
fmt.Println(reflect.TypeOf(v)) 

スライスの反射値のタイプはどのようにして調べることができますか?私はSetしようとするが、例[]int{}代わりに[]string{}のために間違ったスライスgolangはスライス値の種類を反映します

t := reflect.TypeOf([]int{}) 
s := reflect.MakeSlice(t, 0, 0) 
v.Set(s) 

を作成する場合、それがクラッシュします

v.Kind = slice 
typeof = reflect.Value 

上記の結果は、私は正確なスライスを知っておく必要がありますリフレクション値のタイプを作成する前に起動するには

答えて

1

、我々はテストでスライスを扱っていることを確認する必要がありますそのチェックがなければreflect.TypeOf(<var>).Kind() == reflect.Slice

、あなたはランタイムパニックを危険にさらします。我々はそう多くの異なった要素タイプを期待しているので、我々は区別するためにswitch文を使用することができますtyp := reflect.TypeOf(<var>).Elem()

::だから、今、私たちはスライスで作業している知っていることを、要素の型を見つけることと同じくらい簡単です

t := reflect.TypeOf(<var>) 
if t.Kind() != reflect.Slice { 
    // handle non-slice vars 
} 
switch t.Elem() { // type of the slice element 
    case reflect.Int: 
     // Handle int case 
    case reflect.String: 
     // Handle string case 
    ... 
    default: 
     // custom types or structs must be explicitly typed 
     // using calls to reflect.TypeOf on the defined type. 
} 
関連する問題