Golang中rows.Scan处理数据库NULL值报错的解决方案咨询
解决Golang数据库Scan时NULL字符串字段的报错问题
你的代码报错是因为Go原生string类型无法存储NULL值,当数据库返回NULL的MIDDLE_NAME字段时,直接扫描到*string指针会触发类型转换错误。下面提供两种可行的解决方式:
方式一:使用sql.NullString(推荐)
标准库database/sql中的sql.NullString结构体专门用来处理这类场景,它包含String(实际字符串值)和Valid(标记是否为NULL)两个字段。修改printRows函数如下:
func printRows(rows *sql.Rows) { cols, _ := rows.Columns() for rows.Next() { // 把string切片替换为sql.NullString切片 columns := make([]sql.NullString, len(cols)) columnPointers := make([]interface{}, len(cols)) for i := range columns { columnPointers[i] = &columns[i] } err := rows.Scan(columnPointers...) if err != nil { panic(err) } var sb strings.Builder sb.WriteString("|") for _, ns := range columns { // 判断是否为NULL,是则输出空字符串,否则输出实际值 if ns.Valid { sb.WriteString(ns.String) } sb.WriteString("|") } log.Println(sb.String()) } }
关键修改点:
- 将存储字段值的切片从
[]string改为[]sql.NullString - 扫描时直接传入
sql.NullString的指针,rows.Scan会自动填充String和Valid字段 - 输出时通过
Valid字段判断是否为NULL,灵活处理显示逻辑
方式二:使用*string指针
如果不想引入sql.NullString,也可以用*string类型来接收值,NULL会被扫描为nil指针:
func printRows(rows *sql.Rows) { cols, _ := rows.Columns() for rows.Next() { // 初始化*string切片,每个元素默认是nil columns := make([]*string, len(cols)) columnPointers := make([]interface{}, len(cols)) for i := range columns { columnPointers[i] = &columns[i] } err := rows.Scan(columnPointers...) if err != nil { panic(err) } var sb strings.Builder sb.WriteString("|") for _, sPtr := range columns { // 判断指针是否为nil(即数据库返回NULL) if sPtr != nil { sb.WriteString(*sPtr) } sb.WriteString("|") } log.Println(sb.String()) } }
这种方式需要注意:空字符串和NULL在指针表现上不同(空字符串是指向""的指针,NULL是nil),如果业务不需要区分两者,用这种方式也可以。
内容的提问来源于stack exchange,提问作者John Scott
相关产品推荐
相关产品推荐

