登录
首页 >  Golang >  Go问答

返回带有数据成员的多态类型

来源:stackoverflow

时间:2024-04-11 19:42:34 457浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《返回带有数据成员的多态类型》,聊聊,我们一起来看看吧!

问题内容

我正在尝试编写一个函数 gettargetserver() 以返回具有数据成员 url 和方法 clos​​e() 的多态类型。这将是从 httptest.newserver() 返回的 *server 的概括,但我希望能够返回 clos​​e() 是 nop 的自定义类型。

type externalTestServer struct {
    URL string
}

func (externalTestServer) Close() {}

func getTargetServer() *externalTestServer {
    if urlbase, ok := optionals["urlbase"].(string); ok {
        return &externalTestServer{URL: urlbase}
    } else {
        testServer := httptest.NewServer(newMyServerHandler())
        // return testServer // ### Error ###
        return &externalTestServer{URL: testServer.URL}
    }
}

func Test_health_check(t *testing.T) {
    testServer := getTargetServer()
    defer testServer.Close()
    response, err := http.Get(testServer.URL + "/health")
    assert.NilError(t, err)
    assert.Assert(t, cmp.Equal(response.StatusCode, http.StatusOK))
}

这就像一个魅力,除了 clos​​e() 总是一个 nop。当我取消注释指示的 ### error ### 行以返回可关闭的 *server 时,我收到以下错误消息:

无法在返回参数中使用 testserver(类型 *httptest.server)作为类型 *externaltestserver

我理解这个错误,但还没有找到一个解决方案,让我返回一个泛化 *server 的多态类型

注意:“a tour of go”定义了一个接口类型,如下所示:

接口类型被定义为一组方法签名。

因此,返回一个简单的接口将不允许直接访问数据成员。


解决方案


您可以创建一个结构体,其中包含一个字符串 url 字段和一个 clos​​e func 字段。 clos​​e func 可以通过 externaltestserverhttptest.server 实现:

type server struct {
    url   string
    close func()
}
if urlbase, ok := optionals["urlbase"].(string); ok {
        extserver := &externaltestserver{url: urlbase}
        return &server{
            url:   urlbase,
            close: extserver.close,
        }
    }
    testserver := httptest.newserver(newmyserverhandler())
    return &server{
        url:   testserver.url,
        close: testserver.close,
    }

http.server 是一个结构体,因此您无法返回概括该结构体的多态对象。不过,您可以做其他事情:

type Server interface {
  GetURL() string
  Close() error
}

type testServer struct {
   URL string
}

func (t testServer) Close() error {}
func (t testServer) GetURL() string {return t.URL}

type httpServer struct {
    *http.Server
}

func (t httpServer) GetURL() string { return the url }

然后您可以从函数返回 server。

理论要掌握,实操不能落!以上关于《返回带有数据成员的多态类型》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>