2016-06-21 27 views
5

Merhaba, Go'u öğreniyorum ve biraz yansıyordum. Böyle bir durumda saplanıp:Dilim yansımasına öğelerini nasıl ekleyebilirim?

  1. Ben struct bir slice Bu dilim İşte

için yeni unsurlar eklemek istiyorum Sonra

  • interface{} olarak işlev geçirilen oluşturmak istediğiniz bir olduğunu Kod örneği ile 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) 
    } 
    

    Hata:panic: reflect: call of reflect.Append on interface Value

    çalışması için bir yol var mı? Not: Referans üzerinde çalışmak istiyorum.

    Çözüm: İşte

    i yapmak yönetmek budur: playground.

  • +0

    Olası çiftleri: http://stackoverflow.com/questions/34600817/pointer-to-interface-with-saving-type/34600906 ve http://stackoverflow.com/questions/37713749/unmarshal -into-dizi-of-struct-in-runtime-in-go/37713982 – JimB

    cevap

    0

    İstediğinizi yapar mı? Yeni dilim iade ediyorum (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)) 
    } 
    

    Not. Geri dönüş değeri olmadan bunu yapmak için başka bir dolaylı katmana (işaretçiye işaretçi) ihtiyacın olacağını düşünüyorum, ama bu benim ilk kez Go'da yansıma yapmaktı, bu yüzden her şeyleri yanlış anlatabilirim.

    +0

    ama nokta ben json kodlamak/decode gibi birçok paketler gibi bir referans üzerinde çalışmak istiyorum yeni bir nesne dönmek istemiyorum veya sql scan vs etc – Vardius

    +0

    @Vardius: Bir işaretçi ile başlamıyorsunuz, bu yüzden bir yere yeni bir tane yapmalısınız. Bir ara yüze bir işaretçiyi iletmek, değerinize bir işaretçi alamaz. – JimB

    +0

    @JimB Ben şimdiye kadar benim ilerleme ile güncellenen benim soru güncellendi – Vardius