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

反射。将结构切片值设置为结构,而无需类型声明(因为它是未知的)

澹台浩广
2023-03-14
问题内容

我正在创建一个帮助程序包,以从队列中弹出有效负载。至关重要的是,此帮助程序必须与导入它的应用程序所使用的结构无关。

此(无操作,仅作为示例)函数将从队列中提供单个有效载荷,其类型like interface{}如下:

func One(like interface{}) interface{} {
    typ := reflect.TypeOf(like)
    one := reflect.New(typ)

    return one.Interface()
}

此功能提供许多有效负载:

func Many(num int, like interface{}) interface{} {
    typ := reflect.TypeOf(like)
    many := reflect.MakeSlice(reflect.SliceOf(typ), num, num)

    for i := 0; i < num; i++ {
        one := One(typ)
        many.Index(i).Set(one)
    }

    return many.Interface()
}

用法示例是:

type Payload struct {
    Id int
    Text string
}

func main() {
    Many(4, Payload{})
}

但是,以上结果导致:

panic: reflect.Set: value of type **reflect.rtype is not assignable to type main.Payload

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


问题答案:

你调用reflect.TypeOf一个reflect.Value,这就是**reflect.rtype来自何方。

直接One使用like值调用函数,然后将结果分配给切片。

func One(like interface{}) interface{} {
    typ := reflect.TypeOf(like)
    one := reflect.New(typ)

    return one.Interface()
}

func Many(num int, like interface{}) interface{} {
    typ := reflect.TypeOf(like)
    many := reflect.MakeSlice(reflect.SliceOf(typ), num, num)

    for i := 0; i < num; i++ {
        one := One(like)
        many.Index(i).Set(reflect.ValueOf(one).Elem())
    }

    return many.Interface()
}

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



 类似资料:
  • 我试图在Go中创建一个泛型方法,该方法将使用来自< code > map[string]interface { } 的数据填充< code>struct。例如,方法签名和用法可能如下所示: 我知道使用JSON作为中介可以做到这一点;有没有其他更有效的方法?

  • 问题内容: 我在以下测试代码中尝试转换为a 时并没有完全理解问题所在: 与有所不同 吗? 还是ListSociete与ListSociete不同? 谢谢。 问题答案: 您当前正在处理两种不同的类型: 和匿名的: 如果不是标记,那么这两个将是相同的。在 围棋规格 的状态(我的重点): 如果两个struct类型具有相同的字段序列,并且对应的字段具有相同的名称,相同的类型 和相同的tag ,则它们是 相

  • 问题内容: 在玩过Go HTML模板后,我发现所有用于遍历模板中对象的示例都是将切片的结构传递给模板,有点像此示例中所示: 其中“主要”模板为: 这有效,但是如果我仅使用.Name属性,则我不明白如何在每个ID旁边显示每个ID。我会发现在显示时将每个用户视为一个对象来对其属性进行分组会更合乎逻辑。 因此,我的问题是: 如果我想将结构片段传递给模板怎么办? 使它起作用的语法是什么?我尚未在官方htm

  • 问题内容: 我想我需要反射包才能做到这一点。说我有一个像这样的结构: 说我想生成ResolutionValue结构的JSON表示…是否有某种方法可以创建不实例化的JSON表示? 问题答案: 即使使用反射,也需要使用实际值来获取类型。因此,我建议您只使用类型的零值。

  • 问题内容: 我不理解以下代码的行为。在创建作为结构指针切片的匹配结构列表时,代码始终会打印原始数组的最后一个元素(实际上不是匹配项),它会打印12和12。但是,如果将匹配项更改为[]窗口小部件代替[] * Widget,然后将输出10和11。 为什么是这样? 问题答案: 那是因为当您使用指针时,您将添加到数组。 请注意,实际上这是循环中使用的局部变量,因此,这不是您要添加到数组中的地址。 (即使变

  • 在使用来自Java背景的Swift时,为什么要选择结构而不是类呢?似乎它们是一样的,结构提供的功能较少。那为什么选择它呢?