我正在尝试interface{}通过添加缓存来编写一个使用参数返回数据的函数的包装。
我的问题是,一旦我有一个有效的interface{}我不知道如何分配它以在参数中返回。包装的调用(github.Client) .Do在github API 客户端中,当我尝试使用go-cache添加缓存时,问题就来了
这有点我的功能
func (c *cachedClient) requestAPI(url string, v interface{}) error {
x, found := c.cache.Get(url)
if found { // Found in cache code
log.Printf("cached: %v", x)
v = x // HERE: this do not work. x contains a valid copy of what I want but how do I store it in v?
return nil
}
req, _ := c.githubClient.NewRequest("GET", url, nil) // not found I cache, request it
res, err := c.githubClient.Do(*c.context, req, v)
if err != nil {
return err
}
if res.StatusCode != 200 {
return fmt.Errorf("Error Getting %v: %v", url, res.Status)
}
c.cache.Add(url, v, cache.DefaultExpiration) // store in cache
return nil // once here v works as expected and contain a valid item
}
当我尝试像这样使用它时必须返回缓存值时它会失败:
// Some init code c is a cachedClient
i := new(github.Issue)
c.requestAPI(anAPIValidURLforAnIssue, i)
log.Printf("%+v", i) // var i correctly contains an issue from the github api
o := new(github.Issue)
c.requestAPI(anAPIValidURLforAnIssue, o)
log.Printf("%+v", o) // var o should have been get from the cache but here is empty
所以基本上我的问题是,当我正确恢复缓存项目时它很好,但我不能将它存储在用于存储它的参数中。我不能使用子类,因为我正在包装的调用interface{}已经使用了。而且我不能移动它来返回值,因为你不能返回一个通用接口。如何使interface{} x存储在 v 中以使其在外部可用?
临摹微笑
蝴蝶刀刀
相关分类