2 回答
TA贡献1982条经验 获得超2个赞
要归档您想要的内容,您需要使用一些反射魔法。请尝试v = x用下一个代码段替换:
reflect.ValueOf(v).Elem().Set(reflect.ValueOf(x).Elem())
来自 OP 的注释:我必须添加最后一个.Elem()才能完成这项工作。
注意:在调用该requestAPI方法时,您应该使用指向该值的指针:假设缓存的值是 type int。然后你应该requestAPI像这样打电话:
var dst int // destination of the cached value or a newly retrieved result
cc.requestAPI(url, &dst)
TA贡献1801条经验 获得超8个赞
在某些假设下,例如您将 json 数据存储在下面的缓存中,我将尝试这样做。错误未处理。
package main
import (
"encoding/json"
"fmt"
)
type Data struct {
Name string
}
func main() {
var d Data
requestAPI(&d)
fmt.Println(d)
}
func requestAPI(v interface{}) {
var cache_res interface{} = []byte("{\"Name\":\"CCC\"}")
//assume you got cache_res from cache
x, _ := cache_res.([]byte)
_ = json.Unmarshal(x, &v)
}
其实上面githubClient.Do也是在做的。它检查 v 是否满足io.Writer接口,如果是,则将数据写入 v。如果不是,则将 json 解组到 v 中,如上所示。所以同样可以从缓存中完成。
在这里查看: https ://github.com/google/go-github/blob/v32.1.0/github/github.go#L586
如果缓存对象是特定的,则可以使用以下内容。您不处理空接口{},因为您应该能够将特定类型传递给c.githubClient.Doas v。由于它使用 json 包,它将检测类型信息并相应地将值填充到其中。假设您存储type Data struct
在下面的代码中,消除了其他细节,例如条件检查是否缓存和错误处理
package main
import (
"fmt"
)
type Data struct {
Name string
}
func main() {
var d Data
requestAPI(&d)
fmt.Println(d)
}
func requestAPI(v *Data) {
var cache_res interface{} = Data{"CCC"}
//assume you got cache_res from cache
x, _ := cache_res.(Data)
*v = x
//in case you did not find it in cache then githubClient.Do should unmarshal
//contents of response body into v *Data if Data fields match that of json
//res, err := c.githubClient.Do(*c.context, req, v)
}
- 2 回答
- 0 关注
- 89 浏览
添加回答
举报