我想在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()
}
Run Code Online (Sandbox Code Playgroud)
但我在这里得到一个编译器错误:
row.ScanErrorModel undefined (type *sql.Row has no field or method ScanErrorModel)
Run Code Online (Sandbox Code Playgroud)
是否无法将函数添加到在其他地方定义的结构上?或者我只是犯了语法错误?
您无法定义非本地类型的方法.根据规格:
由T表示的类型称为接收器基类型; 它不能是指针或接口类型,必须在与方法相同的包中声明.
(重点补充.)
你可以做的是建立自己的类型和嵌入导入的类型到它:
// 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
}
Run Code Online (Sandbox Code Playgroud)