2016-04-05 22 views
1

Lütfen aşağıdaki programı kontrol edin. Var z, interface{} tipindedir. Yapı X yapısını depolar. Ancak, X'un yeni bir örneğini oluşturmak için kullanamıyorum. Nesnenin türünü interface{} değişkeninde tutmam gereken ve bu tür bir örnek oluşturmak için bunu kullanmam gereken bir gereksinim var.Git türünde yeni bir örnek oluşturmak için boş bir arabirim tarafından işaret edilen gerçek türü nasıl kullanabiliriz?

fmt.Printf("%v\n", reflect.New(z.(reflect.Type))) //----> Works! 

değiştirilen örneği Go Playground tarih: İşte link for the snippet on go playground

package main 

import (
    "fmt" 
    "reflect" 
) 

type X struct { 
    a int 
    b int 
} 

type MyInt int 

func main() { 
    x := X{} 
    y := reflect.TypeOf(x) 
    fmt.Printf("%v\n", reflect.New(y)) 

    var z interface{} 
    z = y 
    fmt.Printf("%v\n", z) // prints main.X 

    //Below line throws the error 
    fmt.Printf("%v\n", reflect.New(z)) //----> This line throws error 

} 

cevap

0

Bir interface{} değerinden reflect.Type değerini ayıklamak için type assertion kullanabilirsiniz olduğunu.

zreflect.Type türünde bir değer tutmuyorsa veya nil ise yukarıdaki örnek paniklerin dikkat edin. Bunu önlemek için özel virgül-tamam formunu kullanabilirsiniz:

+0

Teşekkürler. İşe yaradı. –