问题标签 [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 回答
737 浏览

json - 在不使用反射或复制代码的情况下从多个 JSON 数组中解组实体

我正在制作一个需要获取分页结果的 JSON API 包装客户端,其中下一页的 URL 由上一页提供。为了减少共享相同响应格式的 100 多个实体的代码重复,我希望有一个客户端方法来获取和解组所有分页页面中的不同实体。

我目前在简化(伪)版本中的方法(没有错误等):

然而问题是这种方法效率低下并且使用了太多的内存等,即首先在一般情况下解组ListResponse,结果为[]interface{}(查看下一个 URL 并将结果连接到单个切片中),然后将其编组以[]interface{}直接在后面解组的目标切片[]Entity1

我也许可以使用该reflect包动态地制作这些实体的新切片,直接解组它们并在之后连接/附加它们,但是如果我理解正确,reflect除非绝对必要,否则我最好不要使用......

0 投票
1 回答
1320 浏览

go - 获取未知类型切片的长度

假设我有一个返回interface{}. 但我知道退货是某种形式的一部分。如何确定该切片的长度?这是我尝试过的示例代码,但它们都会导致编译错误。

我想避免专门类型断言slice变量只是为了找到长度的蛮力方式。

0 投票
2 回答
1280 浏览

go - 无法设置类型为接口的结构的字段{}

我一直在努力使用反射包。下面的代码符合我的预期:

但是,如果我用 替换该行row := nth.Interface().(Person)row := nth.Interface()即删除类型断言,则会收到错误消息:

恐慌:反映:在接口 Value 上调用 reflect.Value.FieldByName “字段:= elem.FieldByName(fieldName)

reflect.TypeOf()在过去的几个小时里,我在其他一些变量上尝试了很多其他的事情,比如尝试做reflect.Indirect()等等……但没有成功。

我读过其他一些类似的问题:

reflect: 在 ptr Value 上调用 reflect.Value.FieldByName

使用接口的字段类型设置结构字段

Golang反射:无法设置包装结构的接口字段

他们似乎表明我对指针或接口的工作方式没有很好的理解。

所以我的问题是,当结构被键入为接口时,我该如何设置结构的字段?


更新

我发布了一个解决方案作为答案,但我对它是否是正确或安全的做事方式没有信心。我希望有人能解释一下,或者发布一个更好的解决方案。

0 投票
1 回答
677 浏览

go - 当参数不是go中的指针时,使用反射通过引用更新值

我在学习 go 中反射、指针和接口的基础知识时遇到了困难,所以这是另一个我似乎无法弄清楚的入门级问题。

这段代码做了我想做的事——我正在使用反射将另一条记录添加到作为接口输入的切片中。

如果我将 Add 和 main 函数更改为此,事情就不会按照我想要的方式工作。

也就是说,log.Println(p)最后没有Sam像我希望的那样显示包含记录的切片。 所以我的问题是我是否有可能Add()收到一个不是指针的切片,并且我仍然在其中编写一些代码Add()会产生第一个场景中显示的结果?

我最近的很多问题都围绕着这种主题,所以我仍然需要一段时间才能弄清楚如何有效地使用反射包。

0 投票
1 回答
589 浏览

go - v.Elem() 与 Indirect(v) 相比,传入 reflect.New(Type) 的结果

我的问题在这里与这个问题有关:

golang - 反射包中的 Elem Vs Indirect

基本上它声称下面的表达式为真,如果someX是一个reflect.Value包含一个指针

如果是这种情况,那么为什么我下面的代码会在最后一行崩溃?

我一直很难理解 Go 中的 reflect 包,很可能我误解了 Go 语言的一些基本方面,如我过去一周一直在问的堆栈溢出问题中所表示的那样。

0 投票
1 回答
48 浏览

go - 在go中,为什么打印时反射的值和它的接口都一样?

反射定律摘录:

(为什么不是 fmt.Println(v)?因为 v 是一个 reflect.Value;我们想要它拥有的具体值。)

这让我很困惑,因为以下代码:

打印相同的输出:

x 的值为:3.4

x的值的接口是:3.4

是因为fmt在内部找到了反射的具体值v吗?

0 投票
1 回答
98 浏览

go - 接口指针的奇怪行为

我写了 3 个类似的函数来找出 Go 指针反射的奇怪行为。

只有 main3 工作,其他 2 会恐慌。为什么?3 的主要区别在于它创造了一个新价值。

至于main2,我想ValueOf().Elem().Interface()已经重构了一个指向的接口struct{}{},只是不明白为什么会失败。

0 投票
2 回答
55 浏览

go - 由于某种原因无法读取 StructTag

我有这个处理程序:

tc.ExtractType 函数看起来像:

它能够找到指向“star”的“type”标签,但由于某种原因,它没有找到指向“true”的“tc_resp_body_type”标签。这是我注销的内容:

有谁知道为什么可以找到“type”标签,但找不到“tc_req_body_type”?

0 投票
2 回答
4330 浏览

go - 使用反射确定类型是否为字符串

关于如何在运行时确定对象类型的一些现有答案..上帝帮助我们

不编译

也不是这个或这个:

我们如何做到这一点?

如果我使用答案之一给出的 typeof 函数,我会得到:

在此处输入图像描述

0 投票
1 回答
154 浏览

json - json解析后如何列出未知字段

想象一下,我们有以下 Go 结构:

和以下json:

我们进行解组:

https://play.golang.org/p/HZgo0jxbQrp

输出将是{parabolic [{input in.csv} {output out.csv}]}有意义的 - 未知字段被忽略。

问题:如何找出哪些字段被忽略了?

getIgnoredFields(cfg, cfgString)会回来["subdir", "params[1].tune"]

(有一个DisallowUnknownFields选项,但有所不同:此选项会导致Unmarshal错误,而问题是如何仍然解析 json 而没有错误并找出哪些字段被忽略)