问题标签 [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 投票
2 回答
549 浏览

go - 从切片中移除接口项

我想删除切片中的一个项目,而不必为切片中的每种类型的项目使用特定的函数。所以,我使用 interface{} 作为切片项目类型:

但是 goLang 不喜欢它:

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

知道怎么做吗?是否可以使用接受任何类型切片项目的通用单个函数?

Refs:如何从 Golang 中的切片中删除元素

0 投票
1 回答
511 浏览

go - 如何将接口内的值转换为golang中的地图?

我是 GO 的新手。

我的目标是获取 item.Data 中的数据并将它们放入地图中,以便我可以将它们作为键值对进行访问。

据我了解,空接口与 Typescript 中的任何类型相同。

你能分享一下如何在goLang中做到这一点吗?

// SearchResult 日志搜索结果条目

PS:item.Data 里面的数据是一个键值对的列表,其中每个键可以包含另一个接口内的数据,其值是一个字符串

编辑:键是动态的

Github 链接

包含数据的界面截图

0 投票
1 回答
245 浏览

json - 未调用自定义 UnmarshalJSON

我有一个由几个结构实现的接口。在我的一种方法中,我基于给定的字符串实例化结构,然后将 json 解析为定义的结构。为此,我实现了 UnmarshalJSON,但它从未被调用过。

界面:

实现接口的两个结构:

请注意,我的truck结构还实现了自定义 UnmarshalJSON。

现在,我主要尝试执行以下操作:

但我收到以下错误:

json:无法将对象解组为 main.vehicle 类型的 Go 值

UnmarshalJSON我知道在实现中没有实际的主体,truck但我希望至少可以打印消息。

我究竟做错了什么?

0 投票
1 回答
195 浏览

go - dep 注入的模拟接口返回类型

编辑

正如在接受的答案中指出的那样,这里的问题是在错误的方向上打字。我想将以下 github 问题添加为附件,因为除了下面的@matt 答案之外,它还为我提供了有用的信息:

https://github.com/golang/mock/issues/316#issuecomment-512043925

原帖

我是依赖注入的新手,想在使用couchbase go sdk的模块上对其进行测试。为此,我需要接口来重现ClusterBucket结构。

在 Cluster 接口上,我需要该Bucket()方法,该方法具有以下签名:

我还需要 Bucket 接口中的以下两个方法:

棘手的部分是 Cluster 和 Bucket 方法都有指针接收器。这本身并不难,因为我知道如何单独模拟这些方法(您只需要使用指向实现接口的类型的指针)。

问题是其中一个 Cluster 方法需要返回一个实现 Bucket 接口的指针,因为它也有指针接收器方法。我尝试了许多组合,但每次我使用非模拟*gocb.Cluster值作为我的一个函数的参数时,它都会失败,因为Bucket集群实例上的方法没有被实例正确实现。

以下是我的最新尝试:

每当我尝试使用实际的 gocb.Cluster 值时,linter 都会返回以下错误:

短绒错误 1

我还尝试将我的数据库接口中的 Bucket 方法签名替换为:

这再次给了我以下 lint 错误:

短绒错误 2

如何实现一个接口来模拟这两种方法?

0 投票
1 回答
137 浏览

go - Go:使用不同数字类型的切片作为结构的字段

我正在编写一个收集器,它收集指标并存储在结构中,如下所示:

但是对于某些指标,使用 float64 没有意义,因为它们的值是无符号整数。知道如何为该Data字段使用不同的数字类型吗?

我可以使用Data []interface{},但是我将无法对数组元素使用索引。

(为了清楚起见:我不需要在一个切片中使用不同的类型,例如 Python 中的列表:我的切片必须是强类型的,但我希望能够更改切片的类型。)

0 投票
1 回答
87 浏览

go - 在 Go 中将 msgp 与接口和映射一起使用

我有一个使用接口作为键的地图。地图是这样定义的MyMap map[Signature]Packets。接口是Signature,并且将有两个结构AB实现这个接口。我也msgp用来序列化这两个结构。

我的问题是msgp自动生成使用指针作为函数接收器类型的方法,我认为这会使键Signature接收指针。如果是这种情况,那么键每次都会不同,因为指针不同,即使基础值相同。因此,每次,我都会创建一个新条目,而不是找到现有条目并对其进行修改。

我想知道:

  1. 有没有办法强制msgp使用具体类型的函数接收器来生成方法?目前,我只能将自动生成的方法的函数接收器修改为MarshalMsg具体UnmarshalMsg类型(AB代替*A*B)。通过这样做,地图的键是 typeA或 type B,并且地图MyMap工作正常。但是,我知道我不应该修改自动生成的代码。所以,我想知道是否有一种可接受的方式来做到这一点。
  2. 如果没有办法做 1.,是否有任何解决方法来解决这个问题?我真的需要地图键的一些多态特性,使用msgp.

更新 1(4 月 12 日):感谢您分享您的想法并提供解决方案。以下是关于我的问题的一些细节。

  1. 背景是地图用于收集不同的网络事件。实现接口的两个结构SignatureEventSignatureIPv4EventSignatureIPv6

并且Signature持有在 IPv4 和 IPv6 数据之间共享的通用方法。因此,本质上,我想在运行时收集和分组相应的 IPv4/v6 事件。地图的关键是识别同一个源,地图的价值是收集不同目的地的事件。

  1. msgp我正在使用的库是这个https://pkg.go.dev/github.com/tinylib/msgp@v1.1.5/msgp

  2. 如果我错了,请纠正我。对于 Go 中的组合,如果方法集中的方法之一具有指针类型的函数接收器,那么实例只会是指针类型吗?所以在这里,就像我一样

每当我Signature用来接收结构EventSignatureIPv6时,结构只会是类型*EventSignatureIPv6

0 投票
2 回答
929 浏览

go - 是否可以将 map[string]string 转换为 map[string]interface{} 而无需在 golang 中使用 for 循环?

当我尝试使用以下代码段将map[string]string对象转换为 golang 时,出现错误。map[string]interface{}

我收到这样的错误:

我可以使用以下代码使用 long for 循环解决方案来转换它,但我想知道是否有更简单的方法。

0 投票
0 回答
59 浏览

go - 使用带有空接口的地图作为 KEY 是否存在任何编程缺陷

以这种方式使用地图是否有任何编程缺陷:

为了清楚起见,我知道我正在做的事情可能违背了几个“最佳实践”的精神,但这不是我的问题。我特别考虑编程问题,例如由于元素大小不同导致的内存问题、哈希冲突的机会增加、由于类型断言增加导致的性能下降等。

更多信息:我需要在我的应用程序中创建一些各种数据类型的“集合”。我在 Essential Go 中看到使用集合的最佳方法是使用带有空结构的映射作为值

但是,在没有泛型的情况下,我要么需要为我希望存储在我的集合中的每种数据/元素类型创建一种新类型的 Set:

...或者,使用空接口作为 hashmap 的键:

第二个选项效果很好(你可以在这里找到我的完整代码),但我担心我忽略了一些明显的东西,以后会遇到问题。

谢谢你的帮助。

0 投票
1 回答
148 浏览

go - 无法在 Golang 中编写可以在多个结构上工作的通用函数

我是 Go 新手,正在学习接口和结构。我有 2 个结构 - ServiceSectionSliderSection,我正在尝试用它们完成以下 2 个任务-

  1. 获取 JSON 响应并解组它。
  2. 使用 struct 使用“html/template”创建 HTML

因此,我正在尝试创建一个通用函数来执行可用于多个结构的任务。计划是再创建 5-6 个这样的结构。以下是我创建的代码 -

在执行上述程序时,我在解组 JSON 时在populateHTMLcommon()函数中收到以下错误 -

json:无法将对象解组为 main.MyInterface 类型的 Go 值

这意味着它无法从MyInterface接口识别适当的结构。

我不明白如何创建一个适用于多个结构的通用函数。任何帮助表示赞赏。

0 投票
1 回答
233 浏览

rust - Go 接口和 Rust 特征,以及将函数从 Go 移植到 Rust

我有这段代码-

这里 casbin.Enforcer 是 -

链接 - https://github.com/casbin/casbin/blob/master/enforcer.go#L33

并且persist.Adapter是-

链接 - https://github.com/casbin/casbin/blob/master/persist/adapter.go#L47

rust 中对应的结构和特征是 -

链接 - https://github.com/casbin/casbin-rs/blob/master/src/enforcer.rs#L58

链接 - https://github.com/casbin/casbin-rs/blob/master/src/adapter/mod.rs#L22

我想将代码移植到 rust 中。我写了这个结构 -

NewServer()但我也无法理解如何实施getEnforcer()