问题标签 [go-reflect]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1209 浏览

go - 以编程方式填充 golang 结构

我有一个包含多种类型数据记录的文件,我需要将其解析为结构。

我会很感激学习一种惯用的方式——如果存在的话——按记录类型填充结构。类似于 python 的namedtuple(*fields)构造函数。

我特别有兴趣了解标记的行是否// 1可以// 2方便地被代码替换,也许是某种允许结构本身处理类型转换的通用解码器。

0 投票
0 回答
86 浏览

go - 有没有办法从 reflect.Func 中提取包路径?

reflect.TypeOf用于函数时,结果对象为空PkgPath()。显示这一点的完整示例如下:

我是否理解正确,不需要从函数中获取 pkg 路径,也没有办法学习它,因为 reflect.Type 单独用于函数?如果没有 - 还有办法以某种方式提取它吗?

编辑 1:我要解决的问题是编写一个代码生成器,该生成器将创建一个代码,使用我传递给该代码生成器的函数来执行某些操作。代码生成器是一个在我的实用程序的主函数中调用的库,它应该以某种方式获取我在某些包中定义的函数并创建以某种方式使用这些函数的代码。

0 投票
1 回答
54 浏览

go - 我可以创建一个与另一个签名相同的函数吗?

我需要创建一个包装内部函数的函数,并且与内部函数具有完全相同的签名。我担心这是不可能的,因为 Go 不支持泛型,但也许可以使用reflect? 以下是我想要的伪围棋:

伪代码充满了错误,但想法是wrapInnerinner. 但是,它能够检查签名(可能使用reflect?)并创建一个向内部添加逻辑并具有与内部完全相同的签名的函数。这可能吗?

0 投票
1 回答
1390 浏览

go - 如何在 Go 中获取结构的方法列表?

我有一个库,其中有ClientMockClient都实现相同ClientInterface接口的结构。我想编写单元测试以使这些结构保持同步,以便它们不仅实现接口,而且MockClient具有所有Client的方法。为此,我想获取一个结构的方法列表,以便ClientMockClient.

我已经尝试过调整如何在 Go 中获取函数的名称?到这个简化的例子:

我想要的是这个脚本(在https://play.golang.org/p/HwvhEPfWI5I共享)打印GetName。但是,它会打印

如何让这个脚本打印*Person's 方法的名称?

0 投票
0 回答
681 浏览

go - Gomock SetArg() 恐慌

我正在尝试使用 gomock 来模拟一个调用SuccessHandler来测试函数的接口。

我拥有的接口:

并实现Item

请注意,由于SetResults修改了结构,它总是在指针接收器上实现。

我想要模拟做的就是将调用MyItem时的结果设置为参数,并修改参数的值。这是我尝试为模拟做的事情:HandleSuccess()MyItem

这会导致以下情况出现恐慌:

然后,我尝试将变量更改为只是一个结构:

这不会惊慌,但最终不会改变Result.

关于我做错了什么的任何想法?

0 投票
0 回答
240 浏览

go - 使用带有反射的 Gorm 插入数据

我正在创建一个基本的 REST 服务。我的意图是尽可能抽象地为资源编写逻辑。我的意思是,如果我已经为端点创建了一个 CRUD 逻辑/devices,那么当我需要一个新的资源端点时/cars,我不应该在 CRUD 过程中重复自己。

在 Python 等另一种语言中,类和方法是第一类对象,可以存储在列表或字典(映射)中,然后根据需要进行实例化。在 Go 中,这似乎并不容易。我尝试使用反射包。

首先我根据这个创建一个TypeRegistry 。

然后我有处理程序创建者,它旨在处理像这样的所有类型的资源的创建(错误处理已编辑):

我正在使用 Chi,所以我像这样绑定处理程序:

这个想法是,在定义 Gorm 模型之后,通过重复调用它来简单地添加路由,addRoute(r, "devices"); addRoute(r, "cars")以获得跨多个模型的一致 REST 接口。

现在CreateOne()我想在表格中插入一些东西:

我如何使它工作?Gorm 说“创建失败没有这样的表:值”。因为反射值或反射类型与我只是以常规方式实例化对象不同。我如何使它工作?

(附注:考虑到类型开关和类型断言的静态性质,我已经损害了我的一些设计,这可能在像 Python 这样的语言中是可能的。在我看来,使用类型开关乱扔代码是不可避免的试图明确地检查它是否是一个devicecar任何数量的新模型。在常规的面向对象语言中,这可能是简单的多态方法调用。任何指向更好设计的指针也将不胜感激。)

0 投票
1 回答
778 浏览

pointers - 使用reflect.New时如何设置标签

从现有结构创建新结构时,不会在新结构上设置标签。

例如:

游乐场链接: https: //play.golang.org/p/7-zMPnwQ8Vo

使用时如何设置标签reflect.New?甚至可能吗?

0 投票
1 回答
52 浏览

go - 如何创建动态类型的变量

我能够创建一个“样本”类型的变量“模型”,如下所示:

我能够成功创建它,因为我已经知道结构类型(示例)。

但是,当我尝试如下创建类似的变量“a”时,出现语法错误:

请告知如何在 Go 中创建动态类型的变量。

0 投票
3 回答
267 浏览

go - 如何检查函数的返回值是否满足错误接口

我想编写一些代码来检查结构的方法并对它们做出某些断言,例如,它们返回的最后一个东西应该是error. 我尝试了以下示例脚本:

然而,这会产生一个

编译的是最后的以下两行:

但是,这会产生恐慌:

检查最后一个参数是否实现error接口的正确方法是什么?换句话说,我如何获得reflect.Type一个error接口?

0 投票
1 回答
115 浏览

go - 遍历具有嵌入结构的结构

我有几个正在接收数据的结构。所有结构都应包含一些相同的数据,这些数据已嵌入到HeaderData结构中。数据不是同时填充的,我需要一个函数来检查所有字段是否都收到了一个值(不是空字符串)。

我试图用反射解决这个问题。问题是反射会认为HeaderData是一个领域。这意味着它将始终是一个非空字符串,尽管它可能包含空字段。所以我相信我需要一种方法来单独检查该结构。

我尝试使用 访问它anyStruct.HeaderData,但这不起作用,因为“{} 是没有方法的接口”。

有没有其他方法可以访问,HeaderData以便它工作?

或者我可以以某种方式指定dataReady输入必须具有该字段HeaderData吗?

操场