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
相关产品推荐
相关产品推荐

