返回顶部
首页 > 资讯 > 后端开发 > GO >将在 Go 语言切片中应用反射和动态类型
  • 667
分享到

将在 Go 语言切片中应用反射和动态类型

2024-04-04 23:04:01 667人浏览 薄情痞子
摘要

一分耕耘,一分收获!既然打开了这篇文章《将在 Go 语言切片中应用反射和动态类型》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎

一分耕耘,一分收获!既然打开了这篇文章《将在 Go 语言切片中应用反射和动态类型》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

我的问题是 https://stackoverflow.com/a/54909356 的后续问题(演示:Https://play.golang.org/p/vxoQtvseleo)。

在该答案中,有一个给定的结构(foo)。我发现这个概念很有趣,并且想知道对于动态类型也可以做同样的事情。

鉴于以下动态结构(完美运行),您如何创建切片并附加到它?

在这里查看我的尝试:

在此代码片段中,我创建了动态类型。这工作得很好。

typestring := reflect.typeof("")
        typeinteger := reflect.typeof(0)
        fields := make(map[string]*reflect.structfield)
        fields["a"] = &reflect.structfield{
                name: "a",
                type: typestring,
                tag:  reflect.structtag(`JSON:"a"`),
        }
        fields["b"] = &reflect.structfield{
                name: "b",
                type: typeinteger,
                tag:  reflect.structtag(`json:"b"`),
        }
        var structfields []reflect.structfield
        for _, v := range fields {
                structfields = append(structfields, *v)
        }

        structtype := reflect.structof(structfields)

使用该结构,我们发现它工作正常:

v := reflect.new(structtype)
        v.elem().fieldbyname("a").setstring("qwer")
        v.elem().fieldbyname("b").setint(123)

        v2 := reflect.new(structtype)
        v2.elem().fieldbyname("a").setstring("asdf")
        v2.elem().fieldbyname("b").setint(456)

        //+ these look good
        fmt.printf("%v\n", v)
        fmt.printf("%v\n", v2)

但是,进入动态切片时,我们收到错误:

reflection := reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf(structType).Elem()), 0, 0)

        reflectionValue := reflect.New(reflection.Type())
        reflectionValue.Elem().Set(reflection)

        slicePtr := reflect.ValueOf(reflectionValue.Interface())

        sliceValuePtr := slicePtr.Elem()

        value := v.Elem()

        // ERROR HERE
        toSet := reflect.Append(sliceValuePtr, value)

需要调整哪些内容才能使所有内容对齐并 append

请参阅演示中的以下内容:

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


解决方案


structtypereflect.type。表达式 reflect.typeof(structtype) 计算 reflect.type 的值为 reflect.type。直接使用 structtype 而不是调用 reflect.typeof(structtype)

typestring := reflect.typeof("")
typeinteger := reflect.typeof(0)
fields := make(map[string]*reflect.structfield)
fields["a"] = &reflect.structfield{
    name: "a",
    type: typestring,
    tag:  reflect.structtag(`json:"a"`),
}
fields["b"] = &reflect.structfield{
    name: "b",
    type: typeinteger,
    tag:  reflect.structtag(`json:"b"`),
}
var structfields []reflect.structfield
for _, v := range fields {
    structfields = append(structfields, *v)
}

structtype := reflect.structof(structfields)

v := reflect.new(structtype)
v.elem().fieldbyname("a").setstring("qwer")
v.elem().fieldbyname("b").setint(123)

v2 := reflect.new(structtype)
v2.elem().fieldbyname("a").setstring("asdf")
v2.elem().fieldbyname("b").setint(456)

//+ these look good
fmt.printf("%v\n", v)
fmt.printf("%v\n", v2)

reflection := reflect.makeslice(reflect.sliceof(structtype), 0, 0)

fmt.printf("typeof structtype: %v\n", structtype)
fmt.printf("typeof structtype | elem: %v\n", reflect.typeof(structtype).elem())

reflectionvalue := reflect.new(reflection.type())
reflectionvalue.elem().set(reflection)

sliceptr := reflect.valueof(reflectionvalue.interface())

slicevalueptr := sliceptr.elem()

value := v.elem()

fmt.printf("value: %t = (%v)\n", value, value)
fmt.printf("slice: %t = (%v)\n", slicevalueptr, slicevalueptr)

toset := reflect.append(slicevalueptr, value)
fmt.printf("toset: %t = (%v)\n", toset, toset)

slicevalueptr.set(toset)

result := slicevalueptr.interface()

fmt.printf("result: %t = (%v)\n", result, result)

Run it on the Go playground。

这是代码的简化版本:

stringType := reflect.TypeOf("")
intType := reflect.TypeOf(0)
t := reflect.StructOf([]reflect.StructField{
    {
        Name: "A",
        Type: stringType,
        Tag:  reflect.StructTag(`json:"a"`),
    },
    {
        Name: "B",
        Type: intType,
        Tag:  reflect.StructTag(`json:"b"`),
    },
})

v1 := reflect.New(t).Elem()
v1.FieldByName("A").SetString("qwer")
v1.FieldByName("B").SetInt(123)

v2 := reflect.New(t).Elem()
v2.FieldByName("A").SetString("asdf")
v2.FieldByName("B").SetInt(456)

slice := reflect.MakeSlice(reflect.SliceOf(t), 0, 0)
slice = reflect.Append(slice, v1, v2)
fmt.Printf("result: %s = (%v)\n", slice.Type(), slice)

Run it on the playground。

以上就是《将在 Go 语言切片中应用反射和动态类型》的详细内容,更多关于的资料请关注编程网公众号!

您可能感兴趣的文档:

--结束END--

本文标题: 将在 Go 语言切片中应用反射和动态类型

本文链接: https://www.lsjlt.com/news/595795.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 将在 Go 语言切片中应用反射和动态类型
    一分耕耘,一分收获!既然打开了这篇文章《将在 Go 语言切片中应用反射和动态类型》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎...
    99+
    2024-04-04
  • Go语言中数组,切片和映射怎么使用
    这篇文章主要讲解了“Go语言中数组,切片和映射怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中数组,切片和映射怎么使用”吧!Arrays (数组), Slices (切片) ...
    99+
    2023-07-02
  • Go语言中的数组、切片和映射解析
    目录 数组数组的声明数组循环 切片切片声明切片元素循环 映射Map的声明及初始化Map的遍历 数组 数组存放的是固定长度、相同类型的数据,而且这些存放的元素是连续的。 数组的声...
    99+
    2023-09-08
    学习 go 青少年编程 开发语言
  • Go语言reflect.TypeOf()和reflect.Type通过反射获取类型信息
    在 Go语言中通过调用 reflect.TypeOf 函数,我们可以从一个任何非接口类型的值创建一个 reflect.Type 值。reflect.Type 值表示着此非接口值...
    99+
    2022-06-07
    反射 GO typeof
  • Go语言反射获取类型属性和方法示例
    目录reflect.StructField 和 reflect.MethodStructField遍历 Hero 结构体Method小结reflect.StructField 和 r...
    99+
    2024-04-02
  • 详解Go语言中数组,切片和映射的使用
    目录1.Arrays (数组)2.切片2.1 make创建切片3.映射MapArrays (数组), Slices (切片) 和 Maps (映射) 是常见的一类数据结构 1.Arr...
    99+
    2024-04-02
  • 怎么使用Go语言反射获取类型属性
    本篇内容主要讲解“怎么使用Go语言反射获取类型属性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Go语言反射获取类型属性”吧!reflect.StructField 和 reflect....
    99+
    2023-07-02
  • 反射之光:探秘 Go 语言中方法的动态调用
    反射在 go 语言中是一种强大的工具,允许程序动态调用方法。具体步骤包括:获取方法元数据 (reflect.method)检索方法类型 (reflect.value)使用方法类型动态调用...
    99+
    2024-04-08
    go语言 反射
  • 我怎样才能将 gorm 中的所有行作为反射类型切片
    IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天编程网给大家整理了《我怎样才能将 gorm 中的...
    99+
    2024-04-05
  • 切片与变量在Go语言中的应用对比
    切片是可变长度元素集合,提供对底层数组的访问,而变量是固定值的不可变引用。区别在于切片可以包含多个值,而变量只能包含一个;切片是引用类型,而变量是值类型;切片的长度可调整,而变量的值不可...
    99+
    2024-04-02
  • 如何在Go语言中利用反射功能
    标题:Go语言中的反射功能及代码示例 在Go语言中,反射(Reflection)是一种强大的机制,可以在运行时检查变量的类型和值,通过反射,我们可以动态地调用任意方法、修改变量的值,甚...
    99+
    2024-04-02
  • golang 类型转换和反射在代码复用中的应用
    应用场景:类型转换和反射在代码复用中的应用通用函数:创建可处理多种类型的函数,例如下面计算多个值的最大值的函数。反射式 json 解析:通过反射访问 json 数据,无需依赖特定类型的结...
    99+
    2024-05-04
    golang 代码复用
  • Go语言中的映射类型如何使用?
    Go语言中的映射类型如何使用? 在Go语言中,映射(map)是一种内置的数据结构,用于存储键值对。映射允许通过键来快速检索值,类似于其他语言中的字典或哈希表。在本文中,我们将介绍Go语...
    99+
    2024-04-02
  • 学习Go语言文档中的reflect.TypeOf函数实现类型反射
    学习Go语言文档中的reflect.TypeOf函数实现类型反射在 Go 语言中,我们可以使用反射的方式来获取一个变量的类型,这就是 reflect.TypeOf 函数的作用。使用这个函数可以动态获取变量的类型,同时也可以根据变量的类型进行...
    99+
    2023-11-04
    Go语言 reflectTypeOf 类型反射
  • 如何在go语言中利用反射精简代码
    这篇文章主要为大家分析了如何在go语言中利用反射精简代码的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“如何在go语言中利用反射精简代码”的知识吧。反射是 G...
    99+
    2023-06-05
  • Dubbo新动态:Go语言在Dubbo生态中的应用探究
    Dubbo新动态:Go语言在Dubbo生态中的应用探究 近年来,随着微服务架构的兴起,Dubbo作为一款开源的高性能RPC框架,在国内外得到了广泛的应用和推广。在Dubbo的生态圈中,...
    99+
    2024-04-02
  • Golang函数的反射和类型断言的应用和底层实现
    Golang函数的反射和类型断言的应用和底层实现在Golang编程中,函数的反射和类型断言是两个非常重要的概念。函数的反射可以让我们在运行时动态的调用函数,而类型断言则可以帮助我们在处理接口类型时进行类型转换操作。本文将深入讨论这两个概念的...
    99+
    2023-05-16
    反射 Golang函数 类型断言
  • 字符串类型在Go语言中的应用与特性
    字符串类型在 go 语言中广泛用于文本处理和数据表示,以下为其特性:不可变性utf-8 编码可通过 len() 函数获取长度可使用 + 运算符或 strings.join() 函数拼接字...
    99+
    2024-04-03
    字符串 go语言
  • 使用go语言怎么在切片中删除元素
    今天就跟大家聊聊有关使用go语言怎么在切片中删除元素,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Go语言从切片中删除元素Go语言并没有对删除切片元素提供专用的语法或者接口,需要使用...
    99+
    2023-06-15
  • 从零开始学习Go语言切片的原理和应用
    从零开始学习Go语言切片的原理和应用 Go语言中的切片(slice)是一种动态数组,是对数组的封装,它拥有自己的长度和容量,并且可以根据需要动态增长。切片在Go语言中非常常用,掌握切片...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作