我使用的Github客户端允许我更轻松地调用github API方法。
这个库允许我在初始化时提供自己的*http.Client
:
httpClient := &http.Client{}
githubClient := github.NewClient(httpClient)
它工作正常,但现在我还需要别的东西。我想自定义客户端,以便每个请求(即Do
方法)都会添加自定义标头。
我已经阅读了一些关于嵌入的内容,这是我到目前为止所尝试的内容:
package trackerapi
import(
"net/http"
)
type MyClient struct{
*http.Client
}
func (my *MyClient)Do(req *http.Request) (*http.Response, error){
req.Header.Set("cache-control","max-stale=3600")
return my.Client.Do(req)
}
但编译器不允许我使用我的自定义MyClient
代替默认值:
httpClient := &trackerapi.MyClient{}
// ERROR: Cannot use httpClient (type *MyClient) as type
//*http.Client.
githubClient := github.NewClient(httpClient)
我是一个golang新手,所以我的问题是:这是做我想做的正确方法,如果不是,推荐的做法是什么?
答案 0 :(得分:6)
我可以在Golang中进行子类化吗?
简短回答:不.Go不是面向对象的,因此它没有类,因此子类化绝对是不可能的。
更长的答案:
您已经通过嵌入进入正确的轨道,但您无法将自定义客户端替换为需要*http.Client
的任何内容。这就是Go接口的用途。但是标准库在这里没有使用接口(它适用于某些有意义的事情)。
另一种可能的方法是,根据具体需要,可以使用自定义传输,而不是自定义客户端。这确实使用了一个界面。您可以使用添加必要标头的自定义RoundTripper,然后将其分配给*http.Client
结构。