标准库包 database/sql 不依赖具体的数据库,这是在数据库之上的抽象,在具体使用时,只需要引入具体数据库的驱动即可,而且官方也没有提供具体数据库的驱动,有社区自己实现。如果你有一个关系数据库,根据约定,你也可以实现一个满足 database/sql 对数据驱动库要求的驱动。
[goukv](https://github.com/alash3al/goukv) 这个库受到这种设计思路的启发,用于满足各种 Key-Value 数据库。我们知道,目前 Key-Value 的数据缓存或存储系统还是挺多的,我们可以在使用哪个时,引入哪个。但如果一旦想要替换,可能要涉及到不少修改,而且接口也可能很不一样。这个库就能解决此类问题。
## 项目信息
地址:https://github.com/alash3al/goukv
开源时间:2020-02-24
项目描述:goukv 是基于 golang 的键值存储的抽象层,可以轻松添加任何后端提供程序。
虽然刚开源,但版本是 v1.0.0,作者认为是可以稳定线上可用版本。
## 使用
作者提供了两个 Provider:badgerdb 和 golveldb 。我们可以使用其提供的驱动进行使用演示。
```go
package main
import (
"time"
"fmt"
"github.com/alash3al/goukv"
_ "github.com/alash3al/goukv/providers/goleveldb"
)
func main() {
db, err := goukv.Open("goleveldb", map[string]interface{}{
"path": "./db",
})
if err != nil {
panic(err.Error())
}
defer db.Close()
db.Put(goukv.Entry{
Key: []byte("k1"),
Value: []byte("v1"),
TTL: time.Second * 10,
})
fmt.Println(db.Get([]byte("k1")))
}
```
这个库的核心在于 goukv.Provider 接口,具体的 Provider 只需要实现该接口即可。从上面的代码可以看出,在使用时,也是通过获得该接口的一个具体实现,然后进行相关的操作。接口定义如下:
```go
type Provider interface {
Open(map[string]interface{}) (Provider, error)
Put(Entry) error
Get([]byte) ([]byte, error)
Has([]byte) (bool, error)
Delete([]byte) error
Batch([]Entry) error
Scan(ScanOpts)
Close() error
}
```
和 database/sql 具体驱动类似,具体 Provider 引入也是采用了 `_` 的形式。
这种设计方法学会了吗?
有疑问加站长微信联系(非本文作者)