GO Golang:匿名结构和反射组合

在过去 2 个月内阅读了大约 10 次反射定律后。用它开发相同的时间,我不得不说它是一种很酷且易于理解的语言......至少在一定程度上是这样。


我作为 PHP 和 Javascript 开发人员的背景让我很难理解以下示例:


package main


import(

    "fmt"

    "reflect"

)



func test1(){

    type template struct {

        Title string

        Body  string

    }


    data := []template{

        { Title : "About page", Body : "Body info"},

        { Body : "About page 2 ", Title : "Body info 2"},

    }


    fmt.Println( "-- TEST ONE --" ) 

    fmt.Println( data[0].Title )

}


func test2(){

    data := []struct{

        Title string

        Body  string

    }{

        // Assign with the actual order

        { "About page", "Body info"},

        // Key => Val assignment (Pretty cool)

        { Body : "Body info 2 ", Title : "About page 2"},

    }


    fmt.Println( "-- TEST TWO --" ) 

    fmt.Println( data[1].Title )

}


func test3(){

    type template struct {

        Title string

        Body  string

    }


    Amap := map[string]interface{}{

        "template" : template{},

    }


    w := reflect.ValueOf(Amap["template"])

    x := w.Type()

    y := reflect.TypeOf(w.Interface())

    z := reflect.TypeOf(Amap["template"])


    fmt.Printf("%+v\n", x) // main.template

    fmt.Printf("%+v\n", y) // main.template

    fmt.Printf("%+v\n", z) // main.template


    /*

    var data = struct{

        // none of the above can be place in here.... ( (w|x|y|z) is not a type)

    }{ "About page", "Body info"}

    */


    ww := reflect.New(z)

    xx := ww.Interface()

    tt := reflect.TypeOf(xx)


    /*

    // none of the above can be used this way....

    var data = ww{


    }{ "About page", "Body info"}

    */


    fmt.Println( "-- TEST THREE --" ) 

    fmt.Println( data.Title )

}


func main(){

    test1()

    test2()

    test3()

}

上面的例子test1()并按test2()预期工作。我想进一步推动它,test3()但没有成功。我能想到的让它工作的唯一方法是使用类型开关..


但由于我正在尝试,我想知道:


有没有办法从反射值转换匿名结构,而无需检查正在反射的实际结构

你能告诉我一个可行的解决方案来解决 2 个注释掉的代码块中的任何一个 test3()


守着星空守着你
浏览 255回答 1
1回答

桃花长相依

有没有办法从反射值转换1匿名结构而不进行类型检查 [2] 被反射的实际结构?Go 中没有强制转换。如果您的意思是转换,那么您就缺少一个谓词:转换为什么?类型检查是编译器对程序所做的事情。这句话没有意义。您能否向我展示 test3() 中 2 个注释掉的代码块中的任何一个的可行解决方案很简单,只写:var data = struct{string, string}{"About page", "Body info"}如果您打算在运行时构建/创建/组装结构类型,我将不得不让您失望;那是不可能的。编辑(2015 年 2 月 11 日):正在实现通过反射在运行时构建结构类型(以及数组、函数和接口)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go