"Map types" section of the go language specification描述了映射类型的接口和一般用法,"Go maps in action" post on The Go Blog不经意地提到了哈希表和"快速查找、添加和删除".

current runtime/hashmap.go source code将其实现描述为哈希表(通常是摊销的O(1));然而,我在语言规范或其他material 中看不到任何性能特征(如Big O性能)的保证.

Go语言是否做出了任何performance保证(例如,恒定时间插入/查找/删除?) map 类型还是只有interface个担保?(与Java语言相比,在Java语言中,interfacesimplementations是明显分开的.)

推荐答案

语言参考没有对映射的性能做出明确的保证.有一种隐含的期望,即映射的性能与您期望的哈希表的性能相同.我看不出履约保证怎么能避免被模糊地规定或不准确.

Big-O复杂度是描述映射运行时间的一种糟糕方法:实际上,实际时钟时间是相关的,而复杂度不是.理论上,具有有限域(如Int)键的映射在空间和时间上都是微不足道的O(1),而具有无限域(如字符串)的键的映射需要散列和平等性测试的细节才能包含在成本中,这使得插入和查找的最佳情况平均为O(N logn)(因为键的平均大小必须至少为O(logn))才能构建一个包含N个条目的哈希表.除非您在规范中正确地描述了这些细节,否则它将是不准确的,而且正确描述的好处显然是不值得的.

要提供关于实际运行时而不是复杂性的保证也是困难的:目标机器范围很广,以及缓存和垃圾收集的混乱问题.

Go相关问答推荐

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

如何修复Go中调用GetRawInputDeviceInfA Windows API函数时的错误?

需要类型[]*structpb.Value(GCP Golang客户端库;aiPlatform)

Makefilego version和read命令

Azure golang SDK - 将 AcrPull 角色分配给 AKS 群集

这是go语言gin提供的关于TypeEngine和RouterGroup的问题

Golang Fiber Render - 将数据发送到多个布局

Go 中的 protobuf FieldMask 解组

如何在正则表达式中使整个单词可选?

转到 bufio.Writer、gzip.Writer 并上传到内存中的 AWS S3

如何用mpb创建两行进度条?

通过多阶段构建复制到 Docker 容器中时找不到文件

Neptune 在连接到启用 IAM 的 Neptune 实例时抛出握手错误错误

golang 中的可变参数函数

将 big.Int 转换为 [2]int64,反之亦然和二进制补码

如何编写一个以字符串或错误为参数的通用函数?

Go 泛型:自引用接口约束

Golang:隐式 struct 匹配

在 Golang 中使用 OR 条件验证 struct 的两个字段

如何将类型转换为字节数组golang