Go 如何访问sql.Rows的未转换驱动程序.Value切片

Go 如何访问sql.Rows的未转换驱动程序.Value切片,go,Go,我的目标是获得原始的driver.Value值,该值由sql驱动程序在其driver.Rows.Next()的实现中反序列化我想处理从驱动程序返回的值到所需目标类型的转换,而不是依赖内置到行的自动转换。Scan注意,此问题不会询问您对是否使用行的意见。Scan“应该”。我不想用它,我在问是否有办法避免它 有意义的答案不使用行。完全扫描。中所示的动态方法非常糟糕:它调用所有扫描开销并销毁源列的类型信息,而不是将实际的驱动程序.Values分解为SqlBytes 下面的hack是可行的,但依赖于内部

我的目标是获得原始的
driver.Value
值,该值由sql驱动程序在其
driver.Rows.Next()的实现中反序列化我想处理从驱动程序返回的值到所需目标类型的转换,而不是依赖内置到
行的自动转换。Scan
注意,此问题不会询问您对是否使用
行的意见。Scan
“应该”。我不想用它,我在问是否有办法避免它

有意义的答案不使用
行。完全扫描
。中所示的动态方法非常糟糕:它调用所有扫描开销并销毁源列的类型信息,而不是将实际的
驱动程序.Value
s分解为
SqlBytes

下面的hack是可行的,但依赖于内部实现细节,即
sql.Rows.Next()
使用我想要的未转换值填充内部字段
lastcols

vpRows:=reflect.ValueOf(rows)//rows是一个*sql.rows
vRows:=reflect.Indirect(vpRows)//现在我们有了sql.Rows结构
mem:=vRows.FieldByName(“lastcols”)//未报告的字段lastcols
unsafeLastCols:=unsafe.Pointer(mem.UnsafeAddr())//邪恶
plastCols:=(*[]driver.Value)(unsafeLastCols)//但有效
对于行。下一个(){
rowVals:=*plastCols
格式打印LN(rowVals)
}

通常的解决方案是实现您自己的解决方案。但这确实使用了
行.Scan
,因此它违反了您不使用
行.Scan
的神秘要求


如果您确实必须避免使用
行。Scan
,则需要编写自己的驱动程序实现(可能会包装现有的驱动程序)它提供了对
驱动程序.Value
值的访问,而无需
行。Scan

实现这一点的唯一方法是编写自己的驱动程序实现来包装底层驱动程序。也就是说,这听起来完全像XY问题,您似乎知道:)除了实现Scanner接口并在Scan中使用它之外,我认为在
数据库/sql
中没有任何其他东西可以为您提供驱动程序。值,它被提供给
*sql.Rows
。。。根据您所使用的数据库,您可能希望查看驱动程序的较低级别实现,例如。@Flimzy我不同意这一点。将从数据库检索值的机制从转换到运行时表示的业务逻辑中分离出来是完全合理的?