问题标签 [go-map]
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 - 构建多维数组响应
我正在尝试创建这样的响应:
以下是我为此编写的脚本:
main.go
get_http_methods.go
但是此脚本显示以下错误。我该如何解决这个错误?请指教。
不能使用 SearchMethod(filename) (type map[string][]string) 作为 type []string in assignment go
错误出现在这一行 allcontrollers[filename] = SearchMethod(filename)
for-loop - 在 Go 中循环切片以创建地图
我正在遍历 Go 中的一个切片,该切片由我制作的名为 Product 的结构组成。
我想将此切片转换为地图,以便产品 ID 是键,产品是值。
这是我创建的结构。
这是我创建的功能...
还有更多代码,但除了 for 循环之外,所有代码都可以正常工作。当我在 for 循环中打印出 prod 映射时,它确实会单独检查 productList 中的每一项(190 项),但它只会返回一项 - 最后一项。我应该以某种方式将每次迭代附加到地图上吗?我在视频教程旁边进行编码,并拥有教程视频中的源文件,与他们的代码相比,我的代码找不到任何问题......
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 - 考虑到元素数量将小于 500,从字符串切片中删除是否比具有虚拟值的字符串映射更快
我将从框架中一一接收字符串,我需要将它们保存在某个容器中并稍后删除其中一些。现在我有两个选择:-
- 创建一段字符串,然后通过查找删除一些项目
- 使用 key=string 和 data=dummy 数据创建字符串映射,以便轻松删除
所以我个人更喜欢第二种选择。这是正确的选择吗?我们有更好的办法吗?
go - 使用带有空接口的地图作为 KEY 是否存在任何编程缺陷
以这种方式使用地图是否有任何编程缺陷:
为了清楚起见,我知道我正在做的事情可能违背了几个“最佳实践”的精神,但这不是我的问题。我特别考虑编程问题,例如由于元素大小不同导致的内存问题、哈希冲突的机会增加、由于类型断言增加导致的性能下降等。
更多信息:我需要在我的应用程序中创建一些各种数据类型的“集合”。我在 Essential Go 中看到使用集合的最佳方法是使用带有空结构的映射作为值。
但是,在没有泛型的情况下,我要么需要为我希望存储在我的集合中的每种数据/元素类型创建一种新类型的 Set:
...或者,使用空接口作为 hashmap 的键:
第二个选项效果很好(你可以在这里找到我的完整代码),但我担心我忽略了一些明显的东西,以后会遇到问题。
谢谢你的帮助。
go - 在 Go Maps 中封装“并发安全”
我有一个结构,MyStruct
其中包含一个地图。我想让对地图的访问对并发读写安全,但我也想坚持基础Map
而不是使用sync.Map
.
出于这个原因,我创建了MyStruct
受互斥锁保护的插入、删除和获取方法。代码看起来像这样
到目前为止,一切都很好。
一些客户MyStruct
虽然也需要循环,但myStruct.myMap
我的问题来了。哪个是最好的设计来使并发安全的循环操作不在 MyStruct 的方法中执行?目前我看到 2 个选项
- 将地图
myMap
和互斥锁设为公共mu
,MyStruct
并将责任转移给客户端,以确保循环线程安全。这很简单,但不知何故,感觉好像MyStruct
不太关心它的客户 - 保持一切私密,并添加一个方法,将地图副本返回给想要安全使用它的客户。从“封装”的角度来看,这似乎更好,但同时听起来有点沉重
还有其他可能吗?关于哪种设计更好的建议?
dictionary - 检查一个地图是否是另一个地图的子集
许多其他语言已经回答了这个问题。在带有简单地图(无嵌套)的 golang 中,如何找出一个地图是否是另一个地图的子集。例如:map[string]string{"a": "b", "e": "f"}
是 的子集map[string]string{"a": "b", "c": "d", "e": "f"}
。我想要一个通用的方法。我的代码:
当我想检查集合映射中是否存在子集映射键时,MapIndex
返回类型的零值并使其无法与任何内容进行比较。
毕竟我可以更好地完成同样的工作吗?
go - Golang:将地图中的键附加到切片中
我遇到了这个简单的 Golang 代码,并对 Go 在这里的行为感到惊讶。有人可以解释这里发生了什么,以及如何正确编写下面的代码吗?
如您所见,我有一个map
,其中键是array
of int
。我添加了几个值,然后循环遍历map
,将每个键转换为 aslice
并将每个键附加到类型的对象[][]int
。
我期待最后一行 print [[1,2,3], [0,5,4], [9,7,1], [0,2,8]]
,然而,令我惊讶的是,它会多次打印[[0 2 8] [0 2 8] [0 2 8] [0 2 8]]
, or或其他仅包含一个键的变体。[[9 7 1] [9 7 1] [9 7 1] [9 7 1]]
我的 go 版本是1.16.5
go - 带有大猩猩多路复用器的速率限制器
我正在尝试实现 http 请求限制器,以允许每个用户每秒通过其用户名发出 10 个请求。最多可以向服务器发送 10 个请求,包括正在处理的请求。以下是我参考rate-limit实现的。
我有几个担忧。
我只想要 /index.php 的限制器,而不想要 /hello 的限制器。我确实使用子路由实现了。是正确的方法吗?
限制中间件并不像我想象的那样限制。它允许 1 个成功的请求,所有其他请求都返回太多请求错误。
我在这里想念什么。?