2016-06-21 46 views
5

嗨,我正在學習Go,我正在做一些反思。我被困在一個情況是這樣的:如何添加切片反射元素?

  1. 我想創建的struct一個slice傳遞給函數作爲interface{}
  2. 然後我想新的元素添加到這片

這裏是一個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 -into-array-of-structs-determined-at-runtime-in-go/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編碼/解碼或sql掃描等etc – Vardius

+0

@ Vardius:你不是以指針開始,所以你必須在某個地方做出新的。傳遞一個指向接口的指針並不會讓你指向你的值。 – JimB

+0

@JimB我已經更新了我的問題到目前爲止我的進度 – Vardius