一、声明接口
1 type Result interface { 2 LastInsertId() (int64, error) 3 RowsAffected() (int64, error) 4 }
二、实现接口,这里却将接口作为成员变量,进而将接口的实现转换为接口的调用,仅仅是封装了接口,实际上并没有真的实现,而是坐等别人去实现
1 // 一把锁 2 // 一个结果集的假接口实现,表示需要的功能,让他人来具体实现。假装实现了某个接口,其实是调用了内部接口的对应方法 3 type driverResult struct { 4 sync.Locker 5 resi driver.Result 6 } 7 // Result 是对已执行 SQL 命令的总结,。 8 // LastInsertId() 会返回一个由数据库生成的整数, 这个整数是对命令的响应。 在插入一个新的数据行时, 这个整数通常来源于数据表中的自增数据列。 9 // 并不是所有数据库都支持这个特性, 并且各个数据库在实现这个特性时使用的语句也会有所不同。 10 // RowsAffected() 返回受到更新、插入或者删除操作影响的行数量, 并不是所有数据库或者所有数据库驱动都支持这个特性。 11 type Result interface { 12 LastInsertId() (int64, error) 13 RowsAffected() (int64, error) 14 } 15 16 func (dr driverResult) LastInsertId() (int64, error) { 17 dr.Lock() 18 defer dr.Unlock() 19 return dr.resi.LastInsertId() 20 } 21 22 func (dr driverResult) RowsAffected() (int64, error) { 23 dr.Lock() 24 defer dr.Unlock() 25 return dr.resi.RowsAffected() 26 }