You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle PL/SQL:通过反射迭代嵌套对象表及通用集合

通用深度嵌套命名集合的迭代实现方案

问题背景

基于原StackOverflow回答的扩展需求:原方案仅支持基本数据类型处理,现在需要实现深度嵌套命名集合的通用迭代,涉及book_page、table_of_book_pages、book、table_of_books等自定义类型,目标是输出嵌套的book_pages内容,核心疑问是:能否在不显式声明集合类型变量的前提下完成通用迭代?

实现思路

借助Go反射包的类型检测能力,通过递归遍历实现通用处理:

  • 优先判断当前值的类型:若为集合(切片、数组、映射),则遍历其元素;
  • 若为自定义结构体/命名类型,遍历其字段;
  • 基本数据类型直接输出内容;
  • 递归穿透所有嵌套层级,无需提前声明目标集合类型。

核心代码示例

package main

import (
    "fmt"
    "reflect"
)

// 定义示例数据类型
type book_page struct {
    PageNum int
    Content string
}

type table_of_book_pages []book_page

type book struct {
    Title  string
    Pages  table_of_book_pages
    Author string
}

type table_of_books []book

// 通用深度迭代函数
func iterateValue(v reflect.Value, indent string) {
    switch v.Kind() {
    case reflect.Slice, reflect.Array:
        fmt.Printf("%s[集合类型:%s]\n", indent, v.Type())
        for i := 0; i < v.Len(); i++ {
            fmt.Printf("%s  索引%d:\n", indent, i)
            iterateValue(v.Index(i), indent+"    ")
        }
    case reflect.Struct:
        fmt.Printf("%s[结构体类型:%s]\n", indent, v.Type())
        for i := 0; i < v.NumField(); i++ {
            field := v.Field(i)
            fieldName := v.Type().Field(i).Name
            fmt.Printf("%s  字段%s:\n", indent, fieldName)
            iterateValue(field, indent+"    ")
        }
    case reflect.String, reflect.Int, reflect.Int32, reflect.Int64:
        fmt.Printf("%s值:%v\n", indent, v.Interface())
    case reflect.Map:
        fmt.Printf("%s[映射类型:%s]\n", indent, v.Type())
        for _, key := range v.MapKeys() {
            fmt.Printf("%s  键%v:\n", indent, key.Interface())
            iterateValue(v.MapIndex(key), indent+"    ")
        }
    default:
        fmt.Printf("%s[未处理类型:%s] 值:%v\n", indent, v.Type(), v.Interface())
    }
}

// 迭代入口函数
func Iterate(data interface{}) {
    iterateValue(reflect.ValueOf(data), "")
}

func main() {
    // 构造测试数据
    testBook := book{
        Title:  "Go编程实战",
        Author: "张三",
        Pages: table_of_book_pages{
            {PageNum: 1, Content: "Go语言入门"},
            {PageNum: 2, Content: "反射机制详解"},
        },
    }
    testBooks := table_of_books{testBook}

    // 执行通用迭代
    fmt.Println("遍历table_of_books:")
    Iterate(testBooks)
}

效果说明

运行代码后会完整输出嵌套层级的内容,包括book_pages的细节,全程无需显式声明table_of_book_pages、table_of_books这类集合类型变量,完全依赖反射实现通用遍历。

结论

完全可以实现无需显式声明集合类型变量的通用深度迭代:

  • 反射的类型判断+递归逻辑可覆盖所有嵌套层级;
  • 自定义命名集合(如table_of_book_pages)的底层类型会被反射识别,自动触发遍历逻辑;
  • 代码具备通用性,可适配任意结构的嵌套数据,无需针对特定集合类型编写硬编码逻辑。

内容的提问来源于stack exchange,提问作者Joao Pereira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:54:49