问题标签 [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.
go - 有没有办法使用反射来识别 Go 中的类型关系?
语境
为 Go 语言库编写 URL 查询参数解析器
问题
我知道,只有结构在 Go 中具有继承形式。可以使用反射包来辨别实体的种类,即它是类型系统中的基本存储类,并且可以探测所述元素的类型。所以我可以辨别实体是 Kind 字符串,并且 Type Title,作为一个任意的例子,假设存在这样的东西:
更好的是,对于结构,我可以使用匿名成员来获得有限类型的继承:
关键是,Go 允许我将 Foo 扩展为 Bar,但至少对于 Foo 的部分继承/重用 Foo 函数。
但是,对于非结构类型 - 我不知道如何为类似于 json 或 xml 的编码/解码库解决这个问题 - 我希望能够将查询参数解码为结构的成员,并且至关重要的是,能够支持用户定义的类型,而不需要每个人都为我的目的定义一个专门的解码器或编码器,只要它们是支持我可以使用的接口的类型的派生。
具体来说,我想支持存储为 Google uuid.UUID 或 time.Time(或 time.Duration 也很有用)的用户定义类型。
这是一个简单的例子:
正如声明的那样,这继承了 uuid.UUID 的零行为,我不确定是否或如何使用反射来故意在我的编码器/解码器库中发生这种情况?
Go 本身不会提供它们之间的任何继承或关系。我的 TransactionID 不是 uuid.UUID,但它们共享相同的种类 - [16] 字节数组,据我目前所知,这就是它们共享的全部内容。
这是我的难题
如何允许我希望支持的用户定义类型不要求我的用户现在为他们的类型定义那些我已经为“基本”类型定义的相同编码器或解码器功能?
更多背景信息
我的解码器库使这个接口可用:
我已经为 uuid.UUID 和 time.Time 以及其他一些有用的非结构类型定义了一个专门的扩展来从查询参数字符串中解码它们。如果我要解码的实体类型实际上是 uuid.UUID 或 time.Time 而不是基于这些的用户定义类型,那么一切正常。同样,用户别名之所以有效,是因为它们不是真正的新类型。
别名对于我的目的来说太有限了——它们与别名类型没有任何有意义的区别,这严重限制了它们的实际效用。我不会回应需要使用它们的建议。谢谢你。
更新
理想情况下,用户应该能够为他们的目的定义 TransactionID,我想知道它是“一种”UUID,因此 - 默认情况下 - 使用 UUID 解析器。
用户已经可以轻松定义:
这将迫使我的解码器选择他们定义明确的接口 - 并完全按照他们希望的类型对输入进行解码。
我希望 - 有办法知道他们的类型是____什么的派生类型?如果我有一个解析器用于____什么 - 那么 - 在没有用户定义的 ParseParameter 的情况下 - 使用我的默认提供的 smart one(它知道 [16] 字节与 UUID 不同,并且理解解码 UUID 的更复杂的方法)。
附录
当我得到深思熟虑和有用的回答时,我将扩展这个问题并提供更多细节。我现在不确定我还能提供什么?
如果您选择这样做,感谢您花时间深思熟虑地做出回应。
validation - 使用 Slice 的指针转换接口以迭代其值
语境:
在 Echo 框架中使用自定义的 Binder 和 Validator。活页夹使用 的签名(interface{}, echo.Context)
,但指针始终由 传递和检查echo.DefaultBinder
。
当由于某种未知原因传递数组时,由于某种原因,我无法验证结构数组。因此,我试图验证接口中的每个元素,如果此接口是数组或切片。
问题:
我找不到一种方法来将interface
a 转换为 avalue
而不是 apointer
并遍历该数组的值以验证它们中的每一个。
到目前为止我的代码:
go - 使用反射确定结构字段是否不完整 Cgo 类型
我有一些使用反射来处理结构字段的通用代码。这些字段可能包括也可能不包括通过 Cgo 引用的 C 类型。
我遇到的一个问题是前面提到的那些 C 类型可能是“不完整的结构”,例如:typedef struct unknown u;
. 这可能会导致稍后在代码中出现恐慌。
理想情况下,我需要能够检查和跳过这样的实例,而不会意外跳过有效字段。
我考虑过检查返回的值Type.Size()
是否为 0,但空的 Go 结构将返回相同的值。
有没有办法做到这一点?
json - 是否可以在 Go 中将键值对添加到未知类型的映射中?
我有多个不同格式的 JSON 文件。它们都由一个包含地图的数组组成。然而,这些地图具有不同的结构。
一个.json
b.json
内部映射的 Thr 结构无关紧要。我只想为它们添加一个新的键值对,所以它们看起来像这样 a.json
b.json
go - 通过反射在运行时按名称动态实例化结构
Go 中是否有与 Java 等语言提供的动态类实例化功能等效的东西(注意:为简洁起见,此处省略了必要的异常处理逻辑):
上面的简短 Java 片段本质上是通过提供的完全限定的类路径字符串来获取对 Class 的引用,然后使用类引用来获取对零参数构造函数的引用(其中存在一个),最后构造函数用于获取对类的实例。
我还没有在 Go 中找到一个类似机制的例子,它可以实现类似的结果。更具体地说,似乎 go 中的reflect包要求调用者已经引用了他们希望实例化的结构类型。这方面的标准成语似乎如下:
注意:提供给 reflect.TypeOf 函数的参数必须是Type 而不是 string。可以通过反射包在 Go 中实例化一个结构,只使用它的完全限定名吗?
python - 使用 AppFactory 结构时使用 Flask-Sqlalchemy 反射表会引发运行时错误
我和这个线程有同样的问题:Reflecting tables with Flask-SQLAlchemy raises RuntimeError: application not registered 我试着添加:
在数据库初始化方法中,但我仍然得到:
使用 AppFactory 结构时如何在没有这些问题的情况下反映表?
楷模:
应用程序:
我花了很多时间寻找这个问题的解决方案,但到目前为止我还没有运气。提前致谢!
scala - 用于类验证的 Scala 反射测试
我对斯卡拉完全陌生。我对一个用例有以下要求。
我想为 scala 类做一些反射测试。这个想法是比较类属性并递归检查旧版本类之间的类沿袭。这意味着只需要获取父级和子级的属性,并确保父级中不存在子级不存在的属性(具有相同的类型信息)。
您能否提供一些示例示例?
go - 是否可以在 golang 中动态断言类型?
我有一个 Deduplicate 方法,它返回作为 interface{} 传入的 slice 的去重副本。有没有办法将此方法 interface{} 返回的值转换为与我在此方法中传递的相同类型而不显式编写它?例如,如果我将 myStruct.RelatedIDs 类型从 []int 更改为 []uint,它将阻止代码编译。
go - 避免为字符串映射和切片重复相同的代码
在编写两种方法(一种用于切片,一种用于字符串映射)时,我意识到这两种方法的实现是相同的,唯一改变的是函数的原型。
我试图避免重复它,最初我想到了以下内容(参见 FIXME 部分):
重要的部分是函数getIDsString
,它基本上采用结构的 ID 字段并将其内容连接到切片或映射的所有成员中。
在阅读了一些关于接口如何工作的信息后,我现在意识到(是的,我是 Go 的新手,这可能已经很明显了 :-))这是行不通的,因为 Go 是静态类型的,我不能简单地在运行时更改类型。接口也不允许我迭代。我已经能够使用一个循环来接近,该循环使用 reflect.ValueOf 和 Index() 上的 Len() 方法进行迭代以访问每个元素。但是 Index() 不适用于字符串映射。
在不复制大量代码的情况下解决这个问题的最惯用的方法是什么?
谢谢!
go - 使用反射设置接口方法返回的接口值
给定一个返回指针类型切片但包装为接口类型的接口。是否可以修改值?
如果代码以如下方式初始化:
是否可以B.children
仅用调用后返回的值b.Children()
和使用反射来覆盖值?或者那不可能?