gpt4 book ai didi

reflection - 去戈朗 : anonymous structs & Reflection combination

转载 作者:IT王子 更新时间:2023-10-29 01:59:43 25 4
gpt4 key购买 nike

在最近 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() 进一步插入它,但没有成功。我能想到让它工作的唯一方法是使用类型开关..

但是因为我正在尝试,所以我想知道是否:

  1. 有没有一种方法可以从反射值转换为匿名结构,而无需对正在反射的实际结构进行类型检查
  2. 您能否向我展示一个针对 test3()
  3. 中 2 个注释掉的代码块之一的有效解决方案

最佳答案

  1. Is there a way to cast 1 an anonymous struct from an reflection value without type checking [2] the actual struct that is being reflected?
  1. Go 中没有转换。如果您指的是转换,那么您缺少一个谓词:转换为什么?
  2. 类型检查是编译器对程序所做的事情。这句话没有意义。
  1. Could you show me a working solution to either one of the 2 commented out code blocks from test3()

这个很简单,直接写:

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

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

编辑(2015 年 2 月 11 日):通过反射在运行时构建结构类型(以及数组、函数和接口(interface))是 being implemented .

关于reflection - 去戈朗 : anonymous structs & Reflection combination,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27062197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com