【问题标题】:Can I subclass and redefine a method in Golang?我可以在 Golang 中子类化和重新定义方法吗?
【发布时间】:2017-04-02 20:10:32
【问题描述】:

我正在使用一个 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 新手,所以我的问题是:这是做我想做的事情的正确方法吗?如果不是,推荐的方法是什么?

【问题讨论】:

    标签: go subclass embedding


    【解决方案1】:

    我可以在 Golang 中继承 ...吗?

    简短回答:不。Go 不是面向对象的,因此它没有类,因此子类化绝对是不可能的。

    更长的答案:

    您在嵌入方面走在了正确的轨道上,但您将无法用您的自定义客户端替换任何需要 *http.Client 的内容。这就是 Go 接口的用途。但是标准库在这里没有使用接口(它在一些有意义的地方使用了接口)。

    根据具体需要,另一种可行的方法是使用自定义传输,而不是自定义客户端。这确实使用了一个接口。您可以使用自定义 RoundTripper 来添加必要的标头,您可以将其分配给 *http.Client 结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多