在读studygolang 关于数据访问的内容时,一段代码不理解,就是
```go
type Dao struct {
*sql.DB
// 构造sql语句相关
tablename string
where string
whereVal []interface{} // where条件对应中字段对应的值
limit string
order string
// 插入需要
columns []string // 需要插入数据的字段
colValues []interface{} // 需要插入字段对应的值
// 查询需要
selectCols string // 想要查询那些字段,接在SELECT之后,默认为"*"
}
func (this *Dao) Insert() (sql.Result, error) {
strSql := util.InsertSql(this)
logger.Debugln("Insert sql:", strSql)
err := this.Open()
if err != nil {
return nil, err
}
defer this.Close()
stmt, err := this.Prepare(strSql)
if err != nil {
return nil, err
}
defer stmt.Close()
return stmt.Exec(this.ColValues()...)
}
```
此处strSql := util.InsertSql(this) this 是*Dao对象,可是我打开Util的db.go的代码看到的Util是:
```go
type Sqler interface {
Tablename() string
Columns() []string
SelectCols() string // 需要查询哪些字段
GetWhere() string
GetOrder() string
GetLimit() string
}
func InsertSql(sqler Sqler) string {
columns := sqler.Columns()
columnStr := "`" + strings.Join(columns, "`,`") + "`"
placeHolder := strings.Repeat("?,", len(columns))
sql := fmt.Sprintf("INSERT INTO `%s`(%s) VALUES(%s)", sqler.Tablename(), columnStr, placeHolder[:len(placeHolder)-1])
return strings.TrimSpace(sql)
}```
InsertSql 需要的参数是Sqler 两个并不是同一个对象 。这怎么理解