本文拟以一个接近实际的项目需求例子,来帮助读者体会接口使用的重要性,理解Go接口Interface是如何提高项目的鲁棒性和扩展性。
场景与接口定义
场景:假设有一个在线商城,需要在Go后台提供存储与查询产品的服务。那么我们在项目中应该怎么设计该服务?
ok,需求很明朗,其实就是要一个负责保存和检索产品的存储库。
package productrepo
type ProductRepository interface {
StoreProduct(name string, id int)
FindProductByID(id int)
}
为此,我们创建一个productrepo的包和一个api.go的文件。该API应该暴露出存储库里所有的产品方法。在productrepo包下,定义了ProductRepository接口,它代表的就是存储库。该接口中我们只定义两个简单的方法,StoreProduct()方法用于存储产品信息,FindProductByID()方法通过产品ID查找产品信息。
接口实现示例
既然已经定义了存储库接口,那么现在就需要有实体对象去实现该接口。
package productrepo
import "fmt"
type mockProductRepo struct {
}
func (m mockProductRepo) StoreProduct(name string, id int) {
fmt.Println("mocking the StoreProduct func")
}
func (m mockProductRepo) FindProductByID(id int) {
fmt.Println("mocking the FindProductByID func")
}
如上,在productrepo包下,新建mock.go文件,定义了mockProductRepo对象。正如名字一样,在示例代码中我们并不会真的去做什么(仅仅做个输出打印),但是会mock出ProductRepository接口所需的方法。