欢迎光临鹤城钮言起网络有限公司司官网!
全国咨询热线:13122432650
当前位置: 首页 > 新闻动态

Golang反射获取嵌套结构体字段技巧

时间:2025-11-30 03:05:35

Golang反射获取嵌套结构体字段技巧
豆包大模型 字节跳动自主研发的一系列大型语言模型 834 查看详情 package main import ( "database/sql" "fmt" "log" "reflect" _ "github.com/mattn/go-sqlite3" // 导入 SQLite 驱动 ) func main() { // 1. 打开一个内存中的 SQLite 数据库 db, err := sql.Open("sqlite3", ":memory:") if err != nil { log.Fatalf("无法打开数据库: %v", err) } defer db.Close() // 2. 创建一个示例表并插入数据 sqlStmt := ` CREATE TABLE users ( id INTEGER NOT NULL PRIMARY KEY, name TEXT, age INTEGER, balance REAL, is_active BOOLEAN ); INSERT INTO users(id, name, age, balance, is_active) values(1, 'Alice', 30, 100.50, TRUE); INSERT INTO users(id, name, age, balance, is_active) values(2, 'Bob', 25, 75.25, FALSE); ` _, err = db.Exec(sqlStmt) if err != nil { log.Fatalf("创建表或插入数据失败: %q: %s", err, sqlStmt) } // 3. 执行查询 rows, err := db.Query("SELECT id, name, age, balance, is_active FROM users") if err != nil { log.Fatalf("执行查询失败: %v", err) } defer rows.Close() // 4. 获取列类型信息 columnTypes, err := rows.ColumnTypes() if err != nil { log.Fatalf("获取列类型失败: %v", err) } fmt.Println("--- 列类型信息 ---") for _, ct := range columnTypes { fmt.Printf("列名: %s\n", ct.Name()) fmt.Printf(" 数据库类型名称: %s\n", ct.DatabaseTypeName()) fmt.Printf(" Go 语言推荐扫描类型: %v\n", ct.ScanType()) // 获取其他可选信息 if nullable, ok := ct.Nullable(); ok { fmt.Printf(" 可为空: %t\n", nullable) } if length, ok := ct.Length(); ok { fmt.Printf(" 长度: %d\n", length) } if precision, scale, ok := ct.PrecisionScale(); ok { fmt.Printf(" 精度: %d, 刻度: %d\n", precision, scale) } fmt.Println("-------------------------------") } fmt.Println("\n--- 动态行扫描 ---") // 5. 准备用于动态扫描的变量切片 var scanArgs []interface{} // 存储指向 Go 变量的指针 var columnNames []string // 存储列名,用于结果映射 for _, ct := range columnTypes { columnNames = append(columnNames, ct.Name()) // 根据 ScanType 创建一个新的 Go 变量,并获取其地址 // reflect.New(ct.ScanType()) 创建一个指向零值的指针 scanArgs = append(scanArgs, reflect.New(ct.ScanType()).Interface()) } // 6. 遍历查询结果并动态扫描数据 for rows.Next() { err = rows.Scan(scanArgs...) // 将行数据扫描到 scanArgs 中指向的变量 if err != nil { log.Fatalf("扫描行数据失败: %v", err) } // 7. 处理扫描到的数据 rowData := make(map[string]interface{}) for i, colName := range columnNames { // 通过反射解引用指针,获取实际的值 val := reflect.ValueOf(scanArgs[i]).Elem().Interface() rowData[colName] = val } fmt.Printf("行数据: %v\n", rowData) } if err = rows.Err(); err != nil { log.Fatalf("遍历行时发生错误: %v", err) } }运行上述代码,您将看到类似以下的输出:--- 列类型信息 --- 列名: id 数据库类型名称: INTEGER Go 语言推荐扫描类型: int64 可为空: false ------------------------------- 列名: name 数据库类型名称: TEXT Go 语言推荐扫描类型: string 可为空: true ------------------------------- 列名: age 数据库类型名称: INTEGER Go 语言推荐扫描类型: int64 可为空: true ------------------------------- 列名: balance 数据库类型名称: REAL Go 语言推荐扫描类型: float64 可为空: true ------------------------------- 列名: is_active 数据库类型名称: BOOLEAN Go 语言推荐扫描类型: bool 可为空: true ------------------------------- --- 动态行扫描 --- 行数据: map[age:30 balance:100.5 is_active:true id:1 name:Alice] 行数据: map[age:25 balance:75.25 is_active:false id:2 name:Bob]动态数据处理的进一步思考 上述示例展示了如何将 ScanType() 映射到实际的 Go 类型并创建 interface{} 的指针数组供 rows.Scan() 使用。
AI建筑知识问答 用人工智能ChatGPT帮你解答所有建筑问题 22 查看详情 使用 GDB 调试 Go 程序: 确保 GDB 已正确安装和配置。
actingAs() 方法用于模拟用户认证,确保测试环境与实际应用环境一致。
std::accumulate 简洁高效,适合替代手写 for 循环求和,代码更清晰也更安全。
通常,这通过设置 tree_method 参数为 "gpu_hist" 或通过 device 参数显式指定 "gpu" 来实现。
应在关键边界处添加有意义的信息,如函数名、参数值或操作阶段。
使用 pip 模块可以直接在代码中调用 pip 的功能,而使用 subprocess 模块则可以创建一个新的进程来执行 pip 命令。
Cookie 的过期时间: Cookie 可以设置过期时间,过期后浏览器会自动删除该 Cookie。
开拍 用AI制作口播视频 158 查看详情 复用接口变量,避免在循环中重复赋值 优先传接口指针而非值,减少拷贝开销 注意避免因接口导致的小对象频繁堆分配 使用具体类型进行关键路径优化 在性能关键代码中,可以通过类型断言或泛型切换到具体类型的直接调用路径。
因此,这个表达式等同于getattr(instance, 'data')。
总结 Go语言的切片设计旨在提供一种安全、高效且易于使用的动态数组抽象。
基本结构设计 观察者模式包含两个核心角色:Subject(被观察者)和Observer(观察者)。
只要用对函数、选好字体文件,控制 PHP-GD 文本大小并不复杂,关键是掌握 imagettftext() 的使用方式。
以上就是如何禁用 Python imagecodecs 的性能报告?
总结 本文介绍了如何使用 Pandas 将 DataFrame 列中的数值限制在 360 以内。
对于DRF的API可浏览界面,其内置的认证和登出功能通常依赖于rest_framework.urls中包含的视图。
掌握这些技巧可以帮助我们编写更简洁、更高效的Python代码。
关键是确保what()安全返回字符串,且析构函数不抛异常。
总结 在Python中检查字符串中非连续数字组合的占用情况时,我们应避免使用简单的字符串包含检查。
如果需要自定义编码方式,可以考虑使用 url.QueryEscape 和 url.QueryUnescape 函数。

本文链接:http://www.asphillseesit.com/180123_565710.html