我想在sql.Row
结构上创建一个函数,将一行扫描到我的结构ErrorModel
中。这就是我在做的事情:
func (row *sql.Row) ScanErrorModel(mod *model.ErrorModel, err error) {
err = row.Scan(&mod.MessageId, &mod.ServiceName, &mod.EventName,
&mod.Hostname, &mod.Message, &mod.CriticalRate, &mod.Extra, &mod.Timestamp)
return
}
func (dao *ErrorsDAO) Fetch(id string) (mod *model.ErrorModel, err error) {
row := dao.DB.QueryRow("select * from errors where message_id=$1", id)
return row.ScanErrorModel()
}
但我在这里遇到编译错误:
row.ScanErrorModel undefined (type *sql.Row has no field or method ScanErrorModel)
是否无法将函数添加到在其他地方定义的结构上?或者我只是犯了语法错误?
答案 0 :(得分:7)
您无法定义非本地类型的方法。根据{{3}}:
T表示的类型称为接收器基类型;它不能是指针或接口类型,必须在与方法相同的包中声明。
(强调补充。)
您可以做的是创建自己的类型并将Spec导入的类型添加到其中:
// Has all methods of *sql.Row.
type myRow struct {
*sql.Row
}
func (row myRow) ScanErrorModel(mod *model.ErrorModel, err error) {
err = row.Scan(&mod.MessageId, &mod.ServiceName, &mod.EventName,
&mod.Hostname, &mod.Message, &mod.CriticalRate, &mod.Extra, &mod.Timestamp)
return
}