问题标签 [go-interface]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
62 浏览

go - 方法能否返回一个指针,该方法的返回类型是值

我看到一段代码如下:

只是想知道已经实现了value 方法,为什么它实际上可以返回 struct 的指针draw()

我认为是否应该像下面那样实现一个指针方法,以便该方法CreateShape可以返回结构的指针?

0 投票
1 回答
67 浏览

go - 在不同结构之间共享方法实现

假设我们有 2 个结构共享一个名称和用途相同但大小不同的属性:

目标是使这些结构具有GetLength具有完全相同签名和实现的方法:

——但要避免对每个结构重复实现。

所以我尝试:

- 但错误与h.Length undefined (type *LengthHolderStruct has no field or method Length).

我们该怎么做呢?

0 投票
1 回答
50 浏览

go - Golang:为什么 sql.Tx 没有实现 driver.Tx

为什么在下面的示例中编译器说不sql.Tx实现driver.Tx,看到sql.Tx确实实现了接口:

https://play.golang.org/p/p3vryYI_dhV

0 投票
2 回答
761 浏览

go - 我如何计算出我的错误是什么类型的错误?

我不确定如何准确地表达这个问题,而且我看到其他人问过类似的问题,但并没有真正想出答案(这告诉我我问错了问题,但我不确定如何解决这个问题)。

我正在尝试学习一些基本的围棋,但我在第一个障碍中遇到了困难。

在我的测试代码中,我正在对一个不存在的域执行基本的 http GET 以触发 DNS 警告。我计算出 err.error() 返回一个字符串,因此为了断言它是否是 DNS 错误,我使用了字符串比较:

这显然是 hacky,所以我做了一些谷歌搜索,看看是否有更好的方法来确定引发了什么样的错误,我找到了以下 SO 答案:

如何检查特定的 golang net/http 错误代码?

包“errors”有函数As,是解包特定的错误类型,包“net”有一个*DNSError类型。所以:

这段代码有效,但我对这个结论是如何得出的完全零了解。以下是我试图理解这一点的方法,我想知道我哪里出错了。我(模糊地)了解 .Is() 和 .As() 正在做什么,但我不明白的是如何在不猜测或先验知识的情况下计算出什么错误“类型”来提供这些功能。

我在这里查看了 client.get() 文档,其中说:

任何返回的错误都是 *url.Error 类型。

再进行一些谷歌搜索,我发现我需要将错误转换为该类型才能使用它:

*url.Error 包含:

所以我然后查看 url.Error 中包含的 net.OpError:

然后我做同样的事情并“解包”net.OpError中包含的net.DNSError:

net.DNSError 不“包含”任何其他错误,所以对我来说,这表明它是链的底部和“真正的”错误(或者,至少是我想要处理的错误)。

问题是,这不是一个可行的方法,我不明白我们应该如何处理这个问题。在我发现最初的 SO 文章之前,我不知道 net.DNSError 是一个东西,或者我的错误可能是那种“类型”。

如果您不知道存在特定的错误类型,并且函数调用可能属于该类型,您怎么知道?

我对 Go 中的一般接口和类型的理解非常有限,我确信这在这里没有帮助,但对我来说,在出现错误和知道要检查什么样的错误之间似乎有一个巨大的飞跃是。我希望这个问题是有道理的!

0 投票
1 回答
254 浏览

function - 使用任何值类型的映射作为函数参数?

我正在尝试创建一个以 amap作为参数的函数,其中地图使用string键,但值可以是任何类型。

我如何使这项工作顺利进行?我尝试将map[string]interface{}其用作函数的参数类型,但这似乎不起作用,例如在将 amap[string]int作为参数传递时。

关于这种方法有什么问题以及是否有办法实现这一点的任何解释?

0 投票
1 回答
57 浏览

go - Golang Interface{} 不会将断言输入到 int

我正在开发一个rest api,但由于某种原因无法将接口{} 键入到它的底层类型 - int。

我通过发布请求发送数据,以创建广告。它看起来像这样:

传递的值被解码为 map[string]interface{},如下所示:

当我键入将 costperdayincent 和用户界面值断言为 int 时,我的问题发生了。

if 语句执行,表明它不能键入 assert。为什么是这样?是不是因为传递的 json 将每个值都视为字符串?我将如何解决这个问题?

跟进

我在@DanielFarrell 的回答的帮助下解决了这个问题。

由于我无法在评论部分做出回应,以下是我解码为地图而不是结构的原因:

我知道解码成结构会更有意义。

我最初是在解码成一个结构。但是,我在尝试验证布尔值时遇到了一些问题。即“AllowMobileContact”:真,“AllowEmailContact”:真,“IsActive”:假

如果用户要发出发布请求以创建广告而忽略上述值。当请求正文被解码时,上述字段在结构中将默认为 false(布尔值 0)。如果我要验证传入的值,我将不知道用户是否输入了 false 或遗漏了整个键值对。

因为我想确保用户输入了这些值,所以我首先将其解码为一个映射,以便我可以检查 bool 键值对的键是否存在。然后,如果缺少一些必需的布尔数据,我可以发送相关响应。

如果您知道上述内容的更简单方法,我将有兴趣听到它。有一些 3rd 方包有 3 种布尔值类型,它们可能有效,但我决定改用上面的。

0 投票
1 回答
91 浏览

go - 如何为结构指针上的方法定义接口

对于structs,可以定义一个func可以更新struct变量的 a。有什么方法可以使用这些功能interface吗?

在以下代码中,我尝试创建一个最小示例来描述我的问题。和中struct的两个被定义。两者都有和功能。 函数计算形状的周长。函数通过改变其属性来增加形状的周长。还定义了与方法签名的接口。RectCirclestructPerimeterExpandPerimeterExpandShapePerimeter

viewShapeData函数接受Shape类型的输入参数。此函数查看形状的数据并运行该Perimeter方法并查看形状的周长。

现在我正在寻找Expand一种在函数中调用方法的方法viewShapeData。我尝试了不同的方法并在描述的代码中应用了以下更改:

但是出现了这些错误:

请给我一个解决方案或告诉我为什么 Golang 不支持这种编码。

0 投票
2 回答
85 浏览

go - Go 接口:net.Conn 不是 io.ReadWriteCloser 吗?

我对 go 中接口的使用有疑问。我还在学习这门语言,所以如果这是一个愚蠢的问题,请原谅我。

我正在玩一个接受和处理 TCP 连接的小应用程序。因为我想测试业务逻辑而不是网络魔法,所以我试图使用接口保持一点抽象(这样我就可以使用简单的对象模拟 net.Connio.ReadWriteCloser对象)。

这是我的问题:

我看到的错误是:

我不明白为什么会发生这种情况,因为检查文档和 net lib 源代码,我发现它net.Conn实际上是在实现io.ReadWriteCloser.

我的错误是什么?非常感谢!

0 投票
1 回答
58 浏览

go - 为什么 Go 允许结构实现不同包中存在的未导出接口?

我写了一个示例代码来了解未导出的 接口是如何工作的。在下面的示例中,我在服务包中声明了未导出的repoInterface 。

repo包中的TestRepo结构实现未导出的 repoInterface,没有任何问题。

服务.go

回购/repo.go

main.go

到目前为止我的假设:

这是不可能的,因为 repo 和 service 是不同的包。

repo 包中存在的 TestRepo 结构无法实现服务包中存在的 Unexported 接口。这就是我们导出接口的原因。

现在我意识到这不是真的,我的理解是错误的。

问题:

为什么 Go 允许实现存在于不同包中的未导出接口?

0 投票
1 回答
67 浏览

json - 如何忽略结构的 MarshalJSON 实现(带有嵌套结构)?

是否可以忽略MarshalJSON结构的自定义实现,而只使用标准编组函数?

该结构很复杂,并且有很多嵌套结构,所有这些都使用 custom MarshalJSON,我想忽略它们。

我觉得应该是微不足道的。你有想法吗?

一些细节

创建新类型的明显解决方案效果不佳,因为嵌套结构仍然使用它们MarshalJSON的 s.

以下是代码示例:

(来源:https ://github.com/Azure/azure-sdk-for-go/blob/v62.0.0/services/resources/mgmt/2020-10-01/resources/models.go#L366 )

并且有很多属性(例如Name等),我希望在我的 JSON 中看到这些属性(对于Properties其他嵌套结构也是如此)。

此代码的 Python 实现提供了该数据,我的软件使用它,并且我(将代码移植到 Go)也希望能够从我的 Go 程序中导出这些数据。