2015-01-12 15 views
11

文字列値(name)で構造体を識別しようとしました。 reflect.TypeOfTypeを返します。golang型アサーションでreflect.Typeof()を使用

ただし、アサーションタイプにはtypeが必要です。

Typeへのキャストはどのようにしてtypeにできますか?

それを処理するための提案はありますか?

http://play.golang.org/p/3PJG3YxIyf

package main 

import (
"fmt" 
"reflect" 
) 
type Article struct { 
    Id    int64  `json:"id"` 
    Title   string  `json:"title",sql:"size:255"` 
    Content  string  `json:"content"` 
} 


func IdentifyItemType(name string) interface{} { 
    var item interface{} 
    switch name { 
    default: 
     item = Article{} 
    } 
    return item 
} 

func main() { 

    i := IdentifyItemType("name") 
    item := i.(Article) 
    fmt.Printf("Hello, item : %v\n", item) 
    item2 := i.(reflect.TypeOf(i)) // reflect.TypeOf(i) is not a type 
    fmt.Printf("Hello, item2 : %v\n", item2) 

} 
+6

これはGoでは完全に不可能です。型アサーションは、コンパイル時定数の固定スタティック型のみをアサートします。あなたはあなたのソリューションを再加工する必要があります。 – Volker

+0

コメントありがとうございます。それは非常に明確です! – dorajistyle

答えて

4

型アサーションは、構文的には、式ではなくカッコ内の型を取ります。それは構文エラーです。

実行時に計算された値で型アサーションを実行しようとしているようです。それは理にかなっていますか?タイプアサーションが何であるか考えてみましょう。コンパイル時に

  1. 型アサーションは2つで構成されて所望のコンパイル時の型を有するように、得られた発現を引き起こします。式x.(T)には、コンパイル時のタイプTがあります。これにより、タイプTで行うことができる式を埋め込むことができます。タイプはxではできません。

  2. 実行時:値がnilではなく、実際には指定された型かどうかをチェックし、指定されていない場合はパニックが発生します。

最初の部分は、明らかに実行時に計算される型には意味がありません。結果の式のコンパイル時の型は、コンパイル時に知られていないものに依存することはできません。

実行時に計算された型を使用して2番目の実行チェックを実行できます。次のようなものがあります。

5

外部インターフェイス{}の種類をオンにする必要がある場合は、リフレクションが必要ありません。

switch x.(type){ 
    case int: 
    dosomething() 
} 

...しかし、あなたはインターフェイスの属性のタイプに切り替える必要がある場合、あなたはこれを行うことができます。

s := reflect.ValueOf(x) 
for i:=0; i<s.NumValues; i++{ 
    switch s.Field(i).Interface().(type){ 
    case int: 
     dosomething() 
    } 
} 

私は思います、クリーンな方法を発見していませんそれが存在するかどうかを知ることを愛する。

0

私はあなたがノイズを処理し、すべての種類は、例えば実装し、余分なメソッドを実装することができます場合は、この

item2 := reflect.ValueOf(i) 
fmt.Printf("Hello, item2 : %v\n", item2) 
+1

ValueOf()は、リフレクションタイプを返します。実際の基礎となるタイプのインターフェイスではありません... – MonkeyButter

1

を解決するためにVALUEOFを使用することができると思います'Type()string'では、次のようなことができます。

 ve := &ValidationError{} 
     nf := &NotFound{} 

     switch err.Type() { 
     case ve.Type() : 
      SendBadRequest(w, err) 
     case nf.Type() : 
      http.NotFound(w, r) 
     default: 
      SendInternalError(w, err) 
     } 
     return 
関連する問題