广告
返回顶部
首页 > 资讯 > 后端开发 > GO >递归扩展包含指针的结构定义
  • 852
分享到

递归扩展包含指针的结构定义

2024-04-05 00:04:05 852人浏览 安东尼
摘要

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《递归扩展包含指针的结构定义》,很明显是关于golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《递归扩展包含指针的结构定义》,很明显是关于golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

这个问题基于以下内容: 深入反思 我需要同样的东西 - 扩展结构定义以将其作为 JSON 对象传递,但唯一的区别是结构包含指向另一个结构的指针。因此,提供的代码无法处理该问题。我尝试通过以下方式修改它:

func printfields(prefix string, t reflect.type) {
    for i := 0; i < t.numfield(); i++ {
        f := t.field(i)
        fmt.printf("%v%v %v\n", prefix, f.name, f.type)
        if f.type.kind() == reflect.struct {
            fmt.println(reflect.new(f.type))
            printfields(fmt.sprintf("  %v", prefix), f.type)
        } else if f.type.kind() == reflect.ptr {
            fmt.println("type ", f.type )
            printfields(fmt.sprintf("  %v", prefix), f.type)
        }
    }
}

但是在指针的情况下它会陷入恐慌。如何解决这个问题?

编辑: 得到了我需要的东西:

func printFields(prefix string, t reflect.Type) {
    if t.Kind() != reflect.Struct {
        return
    }
    for i := 0; i < t.NumField(); i++ {
        f := t.Field(i)
        fmt.Printf("%v%v %v\n", prefix, f.Name, f.Type)
        if f.Type.Kind() == reflect.Struct {
            fmt.Println(reflect.New(f.Type))
            printFields(fmt.Sprintf("  %v", prefix), f.Type)
        } else if f.Type.Kind() == reflect.Ptr {
            printFields(fmt.Sprintf("  %v", prefix), f.Type.Elem())
        }
    }
}

func printExpandedStruct(s interface{}) {
    printFields("", reflect.ValueOf(s).Type())
}


解决方案


如果字段类型是指针,则使用指针的元素类型。否则,逻辑与链接问题中的逻辑相同。

func printfields(prefix string, t reflect.type) {
    for i := 0; i < t.numfield(); i++ {
        f := t.field(i)
        fmt.printf("%v%v %v\n", prefix, f.name, f.type)
        ft := f.type
        if ft.kind() == reflect.ptr {
            ft = ft.elem()
        }
        if ft.kind() == reflect.struct {
            printfields(fmt.sprintf("  %v", prefix), ft)
        }
    }
}

Run it on the playground。

以下代码处理更一般的情况,其中字段可以是数组、切片、通道、指针或这些类型的组合。

func printFields(prefix string, t reflect.Type) {
    for i := 0; i < t.NumField(); i++ {
        f := t.Field(i)
        fmt.Printf("%v%v %v\n", prefix, f.Name, f.Type)
        ft := f.Type
        for ft.Kind() == reflect.Ptr ||
            ft.Kind() == reflect.Slice ||
            ft.Kind() == reflect.Array ||
            ft.Kind() == reflect.Chan {
            ft = ft.Elem()
        }
        if ft.Kind() == reflect.Struct {
            printFields(fmt.Sprintf("  %v", prefix), ft)
        }
    }
}

Run it on the playground。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《递归扩展包含指针的结构定义》文章吧,也可关注编程网公众号了解相关技术文章。

您可能感兴趣的文档:

--结束END--

本文标题: 递归扩展包含指针的结构定义

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作