2016-04-14 7 views
3

[]インターフェース{}タイプのリストに複数のタイプを追加することはできません。ように:Go - 反映で[]インターフェース{}に追加

package main 

import "fmt" 

func main() { 
    var foo []interface{} 
    foo = append(foo, "Test") 
    foo = append(foo, "Foo") 
    foo = append(foo, 10) 
    fmt.Printf("%v\n", foo) 
} 

これは反射で可能ですか?私は、次のことをしようと私は言ってパニックを取得:「パニック:reflect.Set:文字列型の値が型に代入ではありませんが、[]インターフェース{}

package main 

import (
    "fmt" 
    "reflect" 
) 

func rf(inf interface{}) { 
    val := reflect.Indirect(reflect.ValueOf(inf)) 
    field := val.FieldByName("Foo") 
    rslice := reflect.MakeSlice(reflect.SliceOf(field.Type()), 0, 5) 
    v := reflect.Indirect(reflect.ValueOf("Test")) 
    rslice = reflect.Append(rslice, v) 
} 

func main() { 
    var s struct { 
     Foo []interface{} 
    } 
    rf(&s) 
    fmt.Printf("%+v\n", s) 
} 

答えて

5

Fooフィールドがタイプ[]interface{}ですでにありますので、SliceOf[][]interface{}を作成しています。これがエラーの原因です。

SliceOfを削除し、field.Set(rslice)を使用して、新しい値を構造体フィールドに戻します。

func rf(inf interface{}) { 
    val := reflect.Indirect(reflect.ValueOf(inf)) 
    field := val.FieldByName("Foo") 
    rslice := reflect.MakeSlice(field.Type(), 0, 5) 
    v := reflect.Indirect(reflect.ValueOf("Test")) 
    rslice = reflect.Append(rslice, v) 
    field.Set(rslice) 
} 

http://play.golang.org/p/gWK3-cP_MN

関連する問題