为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
守着星空守着你 2021-08-30 17:28:29
在过去 2 个月内阅读了大约 10 次反射定律后。用它开发相同的时间,我不得不说它是一种很酷且易于理解的语言......至少在一定程度上是这样。我作为 PHP 和 Javascript 开发人员的背景让我很难理解以下示例:package mainimport(    "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()
查看完整描述

1 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

  1. 有没有办法从反射值转换1匿名结构而不进行类型检查 [2] 被反射的实际结构?

  1. Go 中没有强制转换。如果您的意思是转换,那么您就缺少一个谓词:转换为什么?

  2. 类型检查是编译器对程序所做的事情。这句话没有意义。

  1. 您能否向我展示 test3() 中 2 个注释掉的代码块中的任何一个的可行解决方案

很简单,只写:

var data = struct{string, string}{"About page", "Body info"}

如果您打算在运行时构建/创建/组装结构类型,我将不得不让您失望;那是不可能的。

编辑(2015 年 2 月 11 日):正在实现通过反射在运行时构建结构类型(以及数组、函数和接口)。


查看完整回答
反对 回复 2021-08-30
  • 1 回答
  • 0 关注
  • 245 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信