当前位置: 首页 > 面试题库 >

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

龙霖
2023-03-14
问题内容

有什么方法可以使用反射设置界面字段?当我尝试设置它时,它惊慌地说该值不可寻址。

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中有字段... 我是

  • 问题内容: 看这个: 现在,我有了一些值和一个从文件中加载的值的实例化。我希望将两个结构合并到一起,以便同时获取两个结构的内容。应该覆盖设置的任何内容,而 可能没有设置所有的字段 。(为什么?因为潜在的用户可能不知道默认值,所以删除该条目等同于设置默认值-我认为) 我认为我需要对此进行反思: 在这里我不确定: 如果根本需要反思 可能有更简单的方法可以做到这一点 我在这里看到的另一个问题是检查零值可

  • 问题内容: 例如,如果我们具有以下接口: 以下结构: 并实现了接口: 然后在我们的主要功能中,如果我们想测试一下,将无法正常工作: 这确实按预期工作: 我想念什么?:-) 问题答案: 的接收者是一个值,因此您正在更改结构的副本。 更改为