2017-11-08 12 views
0

に値を変換私は構造体

type pathObject struct { 
    s  *gizmo.Session 
    finals bool 
    path *path.Path 
} 

を次のように私はこの構造体を取得していると私はパスオブジェクトを抽出する必要がありますが、私はここでコンパイルエラーに

を取得しておくされた構造体を持っています変換のための私のコードは

r := reflect.ValueOf(v) 

for i := 0; i < val.NumField(); i++ { 
    valueField := val.Field(i) 
    typeField := val.Type().Field(i) 
    val.Interface() 

    if typeField.Name == "path" { 
     log.Printf("typeName %v\n", typeField.Name) 
     log.Printf("value %v\n", valueField) 

     f := reflect.Indirect(r).FieldByName("path") 

     log.Printf("CanInterface %v\n", valueField.Elem()) 
     p := valueField.Elem().(path.Path) 

     //patObject := reflect.Indirect(valueField).FieldByName("path") 

    } 
    //f := valueField.Interface() 
    //val := reflect.ValueOf(f) 
    //slog.Printf("default %v\n", val) 
} 

私は、この行に pはcompiltionエラーを取得:。= valueField.Elem()(path.Pathは)

を言って
invalid type assertion: valueField.Elem().(path.Path) (non-interface type reflect.Value on left) 

エラーを回避して変換する手がかりはありますか?

答えて

2

reflect.Value Interface() methodを呼び出した結果の型をアサートします。 Interface()メソッドは実際の値を返します。説明として

func getPath(v interface{}) *path.Path { 
    r := reflect.Indirect(reflect.ValueOf(v)) 
    f := r.FieldByName("Path") 
    return f.Interface().(*path.Path) 
} 

playground example

+0

type pathObject struct { s *gizmo.Session finals bool Path *path.Path } 

は、このシンプルなコードを試してみてください。エラーが示すように

p := valueField.Elem().Interface().(path.Path) 

パスフィールドの値にアクセスするためにエクスポートする必要があります、 'Elem()'は 'reflect.Value'を返します。これは値の' reflect' *表現*です。*値ではありません。自体。 'reflect.Value'に' Interface() 'を呼び出すことで、値自体(' interface {} 'とタイプされています)を得ることができます。 – Adrian

+0

これは正常に動作します。私がそれをキャストしようとすると、キャストは失敗します。その理由は、エクスポートできないタイプがあるので、それをどのように処理できるかを理解する必要があります。ご協力いただきありがとうございます – allthenutsandbolts