问题标签 [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.
go - 从切片中移除接口项
我想删除切片中的一个项目,而不必为切片中的每种类型的项目使用特定的函数。所以,我使用 interface{} 作为切片项目类型:
但是 goLang 不喜欢它:
https://play.golang.org/p/wUrR5iGRZ5Y
知道怎么做吗?是否可以使用接受任何类型切片项目的通用单个函数?
Refs:如何从 Golang 中的切片中删除元素
go - 如何将接口内的值转换为golang中的地图?
我是 GO 的新手。
我的目标是获取 item.Data 中的数据并将它们放入地图中,以便我可以将它们作为键值对进行访问。
据我了解,空接口与 Typescript 中的任何类型相同。
你能分享一下如何在goLang中做到这一点吗?
// SearchResult 日志搜索结果条目
PS:item.Data 里面的数据是一个键值对的列表,其中每个键可以包含另一个接口内的数据,其值是一个字符串
编辑:键是动态的
json - 未调用自定义 UnmarshalJSON
我有一个由几个结构实现的接口。在我的一种方法中,我基于给定的字符串实例化结构,然后将 json 解析为定义的结构。为此,我实现了 UnmarshalJSON,但它从未被调用过。
界面:
实现接口的两个结构:
请注意,我的truck
结构还实现了自定义 UnmarshalJSON。
现在,我主要尝试执行以下操作:
但我收到以下错误:
json:无法将对象解组为 main.vehicle 类型的 Go 值
UnmarshalJSON
我知道在实现中没有实际的主体,truck
但我希望至少可以打印消息。
我究竟做错了什么?
go - dep 注入的模拟接口返回类型
编辑
正如在接受的答案中指出的那样,这里的问题是在错误的方向上打字。我想将以下 github 问题添加为附件,因为除了下面的@matt 答案之外,它还为我提供了有用的信息:
https://github.com/golang/mock/issues/316#issuecomment-512043925
原帖
我是依赖注入的新手,想在使用couchbase go sdk的模块上对其进行测试。为此,我需要接口来重现Cluster和Bucket结构。
在 Cluster 接口上,我需要该Bucket()
方法,该方法具有以下签名:
我还需要 Bucket 接口中的以下两个方法:
棘手的部分是 Cluster 和 Bucket 方法都有指针接收器。这本身并不难,因为我知道如何单独模拟这些方法(您只需要使用指向实现接口的类型的指针)。
问题是其中一个 Cluster 方法需要返回一个实现 Bucket 接口的指针,因为它也有指针接收器方法。我尝试了许多组合,但每次我使用非模拟*gocb.Cluster
值作为我的一个函数的参数时,它都会失败,因为Bucket
集群实例上的方法没有被实例正确实现。
以下是我的最新尝试:
每当我尝试使用实际的 gocb.Cluster 值时,linter 都会返回以下错误:
我还尝试将我的数据库接口中的 Bucket 方法签名替换为:
这再次给了我以下 lint 错误:
如何实现一个接口来模拟这两种方法?
go - Go:使用不同数字类型的切片作为结构的字段
我正在编写一个收集器,它收集指标并存储在结构中,如下所示:
但是对于某些指标,使用 float64 没有意义,因为它们的值是无符号整数。知道如何为该Data
字段使用不同的数字类型吗?
我可以使用Data []interface{}
,但是我将无法对数组元素使用索引。
(为了清楚起见:我不需要在一个切片中使用不同的类型,例如 Python 中的列表:我的切片必须是强类型的,但我希望能够更改切片的类型。)
go - 在 Go 中将 msgp 与接口和映射一起使用
我有一个使用接口作为键的地图。地图是这样定义的MyMap map[Signature]Packets
。接口是Signature
,并且将有两个结构A
和B
实现这个接口。我也msgp
用来序列化这两个结构。
我的问题是msgp
自动生成使用指针作为函数接收器类型的方法,我认为这会使键Signature
接收指针。如果是这种情况,那么键每次都会不同,因为指针不同,即使基础值相同。因此,每次,我都会创建一个新条目,而不是找到现有条目并对其进行修改。
我想知道:
- 有没有办法强制
msgp
使用具体类型的函数接收器来生成方法?目前,我只能将自动生成的方法的函数接收器修改为MarshalMsg
具体UnmarshalMsg
类型(A
或B
代替*A
或*B
)。通过这样做,地图的键是 typeA
或 typeB
,并且地图MyMap
工作正常。但是,我知道我不应该修改自动生成的代码。所以,我想知道是否有一种可接受的方式来做到这一点。 - 如果没有办法做 1.,是否有任何解决方法来解决这个问题?我真的需要地图键的一些多态特性,使用
msgp
.
更新 1(4 月 12 日):感谢您分享您的想法并提供解决方案。以下是关于我的问题的一些细节。
- 背景是地图用于收集不同的网络事件。实现接口的两个结构
Signature
是EventSignatureIPv4
和EventSignatureIPv6
并且Signature
持有在 IPv4 和 IPv6 数据之间共享的通用方法。因此,本质上,我想在运行时收集和分组相应的 IPv4/v6 事件。地图的关键是识别同一个源,地图的价值是收集不同目的地的事件。
msgp
我正在使用的库是这个https://pkg.go.dev/github.com/tinylib/msgp@v1.1.5/msgp如果我错了,请纠正我。对于 Go 中的组合,如果方法集中的方法之一具有指针类型的函数接收器,那么实例只会是指针类型吗?所以在这里,就像我一样
每当我Signature
用来接收结构EventSignatureIPv6
时,结构只会是类型*EventSignatureIPv6
?
go - 是否可以将 map[string]string 转换为 map[string]interface{} 而无需在 golang 中使用 for 循环?
当我尝试使用以下代码段将map[string]string
对象转换为 golang 时,出现错误。map[string]interface{}
我收到这样的错误:
我可以使用以下代码使用 long for 循环解决方案来转换它,但我想知道是否有更简单的方法。
go - 使用带有空接口的地图作为 KEY 是否存在任何编程缺陷
以这种方式使用地图是否有任何编程缺陷:
为了清楚起见,我知道我正在做的事情可能违背了几个“最佳实践”的精神,但这不是我的问题。我特别考虑编程问题,例如由于元素大小不同导致的内存问题、哈希冲突的机会增加、由于类型断言增加导致的性能下降等。
更多信息:我需要在我的应用程序中创建一些各种数据类型的“集合”。我在 Essential Go 中看到使用集合的最佳方法是使用带有空结构的映射作为值。
但是,在没有泛型的情况下,我要么需要为我希望存储在我的集合中的每种数据/元素类型创建一种新类型的 Set:
...或者,使用空接口作为 hashmap 的键:
第二个选项效果很好(你可以在这里找到我的完整代码),但我担心我忽略了一些明显的东西,以后会遇到问题。
谢谢你的帮助。
go - 无法在 Golang 中编写可以在多个结构上工作的通用函数
我是 Go 新手,正在学习接口和结构。我有 2 个结构 - ServiceSection和SliderSection,我正在尝试用它们完成以下 2 个任务-
- 获取 JSON 响应并解组它。
- 使用 struct 使用“html/template”创建 HTML
因此,我正在尝试创建一个通用函数来执行可用于多个结构的任务。计划是再创建 5-6 个这样的结构。以下是我创建的代码 -
在执行上述程序时,我在解组 JSON 时在populateHTMLcommon()函数中收到以下错误 -
json:无法将对象解组为 main.MyInterface 类型的 Go 值
这意味着它无法从MyInterface接口识别适当的结构。
我不明白如何创建一个适用于多个结构的通用函数。任何帮助表示赞赏。
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()
。