将“字段”添加到 Golang 中的接口

如何解决将“字段”添加到 Golang 中的接口?

开发过程中遇到将“字段”添加到 Golang 中的接口的问题如何解决?下面主要结合日常开发的经验,给出你关于将“字段”添加到 Golang 中的接口的解决方法建议,希望对你解决将“字段”添加到 Golang 中的接口有所启发或帮助;

问题描述

我有一个“类”CustomClIEnt,它执行一些 http 操作并将一些数据保存在自定义结构中。 CustomClIEnt 的成员之一是 Golang http.ClIEnt

type CustomClIEnt struct {
    commData                        CustomDataStruct
    httpClIEnt                      *http.ClIEnt
}

我正在尝试为 CustomClIEnt 添加一些额外的“可测试性”。目前,我无法控制 httpClIEnt 响应的 http 响应类型。 CustomClIEnt使用 httpClIEnt 来运行 httpClIEnt.Do(),所以我有一个想法来创建一个“接口”来实现这个方法,所以我想让它像:

type ClIEnt interface {
    Do(req *http.Request) (*http.Response,error)
}

type CustomClIEnt struct {
    commData                        CustomDataStruct
    httpClIEnt                      ClIEnt
}

然后使用 Do() 方法创建了自己的类 httpClIEntMOCK,该方法将返回一些用于测试目的的自定义响应:

type httpClIEntMOCK struct {
    Transport *http.Transport
}

func NewhttpClIEntMOCK() *httpClIEntMOCK {
    c := &httpClIEntMOCK{
        Transport: &http.Transport{},}
    return c
}

func (c *httpClIEntMOCK) Do(req *http.Request) (*http.Response,error) {
    // Do stuff
}

只有一个问题——CustomClIEnt的其中一个“成员函数”手动分配了http.ClIEnt.Transport,原http.ClIEnt使用。该行如下所示:

func (cc *CustomClIEnt) updateClIEnt() {
    transport := ... // Do some operations
    cc.httpClIEnt.Transport = transport
}

上一行给出了错误 - 解析的引用'传输'

所以我猜 Golang 无法知道 http.ClIEnt 和 httpClIEntMOCK 实际上都有这个成员 Transport 因为我的接口 ClIEnt 只指定了一种方法

是否有解决问题方法? AFAIK 我的手被绑在这里,因为没有办法为接口定义“数据字段”。

解决方法

使用 Do 方法对 HTTP 客户端进行抽象非常好,但在代码后期,更改传输会破坏该抽象。这应该被审查,是否有任何限制理由这样做? (例如使用多个客户端证书来验证请求)

要使代码正常工作,始终可以强制转换为 *http.Client

func (cc *CustomClient) updateClient() {
    if h,ok := cc.httpClient.(*http.Client); ok {
        transport := ... // Do some operations
        h.Transport = transport
    }
}

编程问答问答

很抱歉格式化。 我正在从数据库接收JSON响应,我需要将日期转换为他/她所在的每个用户的时区。
指标示例: <pre><code>+------+---+-----+-----+-----+-----+-----+-----+-----+-----+-----+---+ | Time |...|12:00|12:01|12:02|12:03
我已经阅读了许多主题,人们通常会说,在最佳情况下,选择排序的复杂度仍然是O(n ^ 2)。但是我不
在我的SwiftUI代码中,我有一个选项卡式视图,而在选项卡视图中,我具有以下代码: <pre><code>
似乎为函数定义了接口,您只需声明函数签名,例如参数,而不是函数名称。 <a href="https://www.types
我正在创建一个客户管理项目,在此我想查询一些与外键有关的模型。 我已经创建了这些模型。</p
我正在使用Google文字进行语音转换,成为树莓派聊天机器人。这是我的代码: <pre><code>import os from gtts
我正在创建一个仪表板,该仪表板上有一系列变量(具体而言是12个),并且正在尝试针对房地产价格运
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注