gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:30:45 26 4
gpt4 key购买 nike

我正在尝试编写一个函数 getTargetServer() 以返回具有数据成员 URL 和方法 Close()< 的多态类型。这将是 *Server 的概括从 httptest.NewServer() 返回但我也希望能够返回 Close() 是 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))
}

除了 Close() 总是 NOP 之外,这就像一个魅力。当我取消注释指示的 ### Error ### 行以返回可关闭的 *Server 时,我收到以下错误消息:

cannot use testServer (type *httptest.Server) as type *externalTestServer in return argument

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


注意:“A Tour of Go”定义了一个接口(interface)类型如下:

An interface type is defined as a set of method signatures.

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

最佳答案

您可以创建一个结构,它有一个字段是字符串 URL 和一个字段是 Close funcClose 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,
}

关于go - 返回带有数据成员的多态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57483515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com