func (*Rows) Scan¶
func (rs *Rows) Scan(dest ...interface{}) error
扫描将当前行中的列复制到 dest 指向的值中。Dest 中的值数必须与行中的列数相同。
Scan 将从数据库读取的列转换为 sql 包提供的下列常用 Go 类型和特殊类型:
\*string
\*[]byte
\*int, \*int8, \*int16, \*int32, \*int64
\*uint, \*uint8, \*uint16, \*uint32, \*uint64
\*bool
\*float32, \*float64
\*interface{}
\*RawBytes
\*Rows (cursor value)
any type implementing Scanner (see Scanner docs)
在最简单的情况下,如果来自源列的值的类型是整数、 bool 或字符串类型 t,dest 的类型是 * t,Scan 只需通过指针赋值。
只要不丢失任何信息,Scan 还可以在字符串和数字类型之间进行转换。当扫描字符串将所有数字从数字数据库列扫描成 * 字符串时,将检查数字类型的扫描是否溢出。例如,值为300的 float64或值为“300”的字符串可以扫描到 uint16,但不能扫描到 uint8,不过 float64(255)或“255”可以扫描到 uint8。一个例外是,扫描一些 float64数字到字符串时,在进行字符串识别时可能会丢失信息。一般来说,将浮点列扫描到 * float64中。
如果 dest 参数具有 type * [] byte,Scan 将在该参数中保存相应数据的副本。副本为调用方所有,可以进行修改并无限期保存。可以通过使用类型为 * RawBytes 的参数来避免副本; 请参阅 RawBytes 的文档以了解对其使用的限制。
如果参数具有 * interface{}类型,则扫描基础驱动程序提供的值,而不进行转换。当从[] byte 类型的源值扫描到 * interface {}时,会生成一个片的副本,并且调用者拥有结果。
类型时间的源值。时间可以被扫描成类型为 * Time 的值。时间、 * 接口{}、 * 字符串或 * []字节。在转换到后两个版本时,使用了 time.RFC3339Nano。
类型 bool 的源值可以被扫描成类型 * bool、 * interface {}、 * string、 * [] byte 或 * RawBytes。
对于扫描到 * bool,源可能是 true,false,1,0,或字符串输入可由 strconv.ParseBool 解析。
Scan 还可以将从查询返回的光标(例如“ select cursor (select * from my _ table) from dual”)转换为本身可以被扫描的 * Rows 值。如果父 *Rows关闭,则会关闭任何游标 *Rows。