在过去 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()
桃花长相依
相关分类