2016-06-21 3 views
5

こんにちは、私はGoを学習しています。私は、このような場合に捕まってしまった:スライス反射に要素を追加するにはどうすればよいですか?

  1. を私はinterface{}
  2. として機能するように渡さstructsliceを作成したいそして、私はここでは、このスライスに

を新しい要素を追加したいaはこのコード例ではplaygroundです。

package main 

import (
    "fmt" 
    "reflect" 
) 

type A struct{ Name string } 

func main() { 
    bbb(A{}) 
} 

func aaa(v interface{}) { 
    sl := reflect.ValueOf(v).Elem() 
    typeOfT := sl.Type() 

    ptr := reflect.New(typeOfT).Interface() 
    s := reflect.ValueOf(ptr).Elem() 
    sl.Set(reflect.Append(sl, s)) 

    ptr = reflect.New(typeOfT).Interface() 
    s = reflect.ValueOf(ptr).Elem() 
    sl.Set(reflect.Append(sl, s)) 
} 

func bbb(v interface{}) { 
    myType := reflect.TypeOf(v) 
    models := reflect.Zero(reflect.SliceOf(myType)).Interface() 
    aaa(&models) 

    fmt.Println(models) 
} 

エラー:panic: reflect: call of reflect.Append on interface Value

はそれを動作させるための方法はありますか? 注:私は参考に作業したいです。

ソリューション:ここ

は私が行うために管理するものである:playground

+0

重複の可能性:http://stackoverflow.com/questions/34600817/pointer-to-interface-with-saving-type/34600906とhttp://stackoverflow.com/questions/37713749/unmarshal 37713982 – JimB

答えて

0

これは必要な操作ですか?私は新しいスライスを返すよ(playground link

package main 

import (
    "fmt" 
    "reflect" 
) 

type A struct{ Name string } 

func main() { 
    bbb(A{}) 
} 

func aaa(v interface{}) interface{} { 
    sl := reflect.Indirect(reflect.ValueOf(v)) 
    typeOfT := sl.Type().Elem() 

    ptr := reflect.New(typeOfT).Interface() 
    s := reflect.ValueOf(ptr).Elem() 
    return reflect.Append(sl, s) 
} 

func bbb(v interface{}) { 
    myType := reflect.TypeOf(v) 
    models := reflect.MakeSlice(reflect.SliceOf(myType), 0, 1).Interface() 
    fmt.Println(aaa(models)) 
} 

注意。私は戻り値なしでこれを行うためにインダイレクション(ポインタへのポインタ)の別のレイヤーが必要だと思うが、これはGoでのリフレクションを初めて行ったので、すべて間違っているかもしれない。

+0

しかし、多くのパッケージがjsonエンコード/デコードのように行うように、参照で作業したい新しいオブジェクトを返すことはありません。 – Vardius

+0

@Vardius:あなたはポインタで始まっていないので、どこかで新しいものを作る必要があります。インターフェイスにポインタを渡しても、値へのポインタは得られません。 – JimB

+0

@JimB私の進捗状況を今までのところ私の質問に更新しました – Vardius

関連する問題