# 如果是查询QueryContext
=> (mc *mysqlConn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error)
-> mc.watchCancel(ctx) 设置超时监控 channel :: mc.watcher <- ctx
-> rows, err := mc.query(query, dargs)
=>(mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error)
-> err := mc.writeCommandPacketStr(comQuery, query) 连接写入sql,tcp 发送包
-> rows := new(textRows) 开辟存储结构的内存空间,类型是textRows
-> rows.rs.columns, err = mc.readColumns(resLen) 从 tcp 二进制流读结果到rows
-> return rows
=> rows->return driver.Rows
=> gorm.Scan(rows, db, mode) 将查询结构 rows 放入 Scan函数返回
=> Scan(rows Rows, db *DB, mode ScanMode)
-> switch dest := db.Statement.Dest.(type) 根据 stmt 的 dest 类型设置怎么读 rows
-> rows.Next()-> db.RowsAffected++ -> rows.Scan(values...)
=> 类比原始 sql 操作
for rows.Next() {
err := rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
log.Println(id, name)
}
————————————————
原文链接:https://blog.csdn.net/u013010890/article/details/132613100