有什么方法可以使用反射设置界面字段?当我尝试设置它时,它惊慌地说该值不可寻址。
type A interface{...}
func CreateA(name string) A {...}
type B struct {
field A
should A
mirror A
}
// normal way of initializing
var b = B{
field: CreateA("field"),
should: CreateA("should"),
mirror: CreateA("mirror"),
}
func MirrorField(b *B) {
t := reflect.TypeOf(b)
v := reflect.ValueOf(b)
for i := 0; i < t.NumField(); i++ {
setTo = CreateA(t.Field(1).Name)
fieldVal := v.Field(i)
fieldVal.Set(reflect.ValueOf(setTo))
}
}
// what i want is something like
var b = &B{}
MirrorField(b)
接口没有字段,它们仅定义包含的值的方法集。在界面上进行反射时,可以使用提取值Value.Elem()
。
您也Set
不能取消导出字段。您需要大写您的B
类型的字段名称。遍历字段时,用于Value.CanSet()
测试它们是否可设置。CanSet()
如果该值不可寻址或该值仍在接口中,则也会返回false。
您的代码的有效示例:http :
//play.golang.org/p/Mf1HENRSny
问题内容: 在使用包处理结构字段时遇到了麻烦。特别是,还没有弄清楚如何设置字段值。 获取字段i的名称-这似乎起作用 作为a)接口{},b)int获取字段i的值-这似乎有效 设置字段i的值-尝试一次-紧急 恐慌 :使用未导出字段中获得的值,使用reflect.Value·SetInt 假设它不喜欢字段名称“ id”和“ name”,因此将其重命名为“ Id”和“ Name” a)这个假设正确吗? b
我使用的是registfit的新beta版本(2.0.0-beta),我使用registfit-gson-converter创建一个POJO。 当使用GSON和改型时,这可能吗?
问题内容: 我在Java中有一个基本问题,但这是OOP中的一个普遍问题。为什么界面允许设置字段?这是否与接口应该做的工作背道而驰? 按照我的理解,接口就是英语中的形容词。因此,如果我的课程实现了Runnable和Serializable接口,那么我向用户保证我的课程将满足Runnable和Seriablizable的条件。但是,这意味着接口是“无状态的”,但是允许它们在Java中具有字段… 我想念
在Java中我有一个基本的问题,但在OOP中它是一个一般的问题。为什么接口允许设置字段?这难道不是与接口应该做的相反吗? 按照我的理解,interface在英语中是一个形容词。因此,如果我的类实现了Runnable和Serializable接口,我就向用户保证我的类将满足Runnable和Serializable的条件。然而,这将意味着接口是“无状态”的,但它们被允许在Java中有字段... 我是
问题内容: 看这个: 现在,我有了一些值和一个从文件中加载的值的实例化。我希望将两个结构合并到一起,以便同时获取两个结构的内容。应该覆盖设置的任何内容,而 可能没有设置所有的字段 。(为什么?因为潜在的用户可能不知道默认值,所以删除该条目等同于设置默认值-我认为) 我认为我需要对此进行反思: 在这里我不确定: 如果根本需要反思 可能有更简单的方法可以做到这一点 我在这里看到的另一个问题是检查零值可
问题内容: 例如,如果我们具有以下接口: 以下结构: 并实现了接口: 然后在我们的主要功能中,如果我们想测试一下,将无法正常工作: 这确实按预期工作: 我想念什么?:-) 问题答案: 的接收者是一个值,因此您正在更改结构的副本。 更改为