在过去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()
进一步推动它,但没有成功。我想到让它工作的唯一方法是使用类型开关..
但是既然我正在尝试,我想知道是否:
test3()
答案 0 :(得分:3)
- 有没有办法从反射值转换1一个匿名结构而不检查[2]正在反映的实际结构?
醇>
- 您能否向我展示一个有效的解决方案,来自test3()的两个注释掉的代码块中的任何一个
醇>
这很简单,只需写:
var data = struct{string, string}{"About page", "Body info"}
如果你想在运行时构建/创建/组装结构类型,我将不得不让你失望;那是不可能的。
编辑(2015年2月11日):通过反射在运行时构建结构类型(以及数组,函数和接口)being implemented。