Golang将函数添加到其他地方定义的结构

时间:2015-06-12 14:03:26

标签: struct go

我想在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)

是否无法将函数添加到在其他地方定义的结构上?或者我只是犯了语法错误?

1 个答案:

答案 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
}