我有以下界面:
type Selector interface {
SelectOne(ctx context.Context, one A) (Result, error)
SelectTwo(ctx context.Context, one A, two B) ([]Result, error)
SelectThree(ctx context.Context, one A, two B, three C) ([]Result, error)
}
以及以下实现:
type Database struct{}
func (d Database) SelectOne(...) (...) {...}
func (d Database) SelectTwo(...) (...) {...}
func (d Database) SelectThree(...) (...) {...}
然后,最重要的是,我想添加一个使用非常好的 github.com/hashicorp/golang-lru 库的缓存层:
type SelectorCache struct {
db Database
cacheOne *lru.Cache
cacheTwo *lru.Cache
}
func (c SelectorCache) SelectOne(ctx context.Context, one A) (Result, error) {
cached, ok := c.cacheOne.Get(makeKey(one))
if ok {
casted, ok := cached.(Result)
if ok {
return casted, nil
}
}
fetched, err := c.db.SelectOne(ctx, one)
if err != nil {
return Result{}, err
}
c.cache.Add(key, fetched)
return fetched, nil
}
func (c SelectorCache) SelectTwo(ctx context.Context, one A, two B) ([]Result, error) {
...
casted, ok := cached.([]Result)
...
fetched, err := c.db.SelectTwo(ctx, one, two)
...
}
func () SelectThree(ctx context.Context, one A, two B, three C) ([]Result, error) {
...
casted, ok := cached.([]Result)
...
fetched, err := c.db.SelectThree(ctx, one, two, three)
...
}
如您所见,每种情况下的缓存层基本相同,唯一的区别在于底层功能。如果那是 Python,我可以轻松地创建一个将 *a, **kw 传递给被包装函数的包装函数。我怎样才能重写它以便样板消失?
慕容708150
缥缈止盈
相关分类