在Go语言中,创建唯一映射键的最有效方法一直是开发者们关注的问题。在面对需要保证键的唯一性的场景时,我们需要寻找一种高效且可靠的方法。php小编百草将在本文中分享一种最有效的方法,帮助您在Go语言中创建唯一映射键,让您的代码更加优化和高效。无论是处理大规模数据还是实现高并发的应用,这些方法都能帮助您提高性能和效率。让我们一起来了解吧!
问题内容
我在图书馆的某个地方有一个 map[any]SomeType
。我希望库用户能够为该地图创建键,以便保证它们在单个应用程序执行中不会发生冲突,并且我希望这些键能够高效地进行地图查找。
首先想到的是使用某个唯一的空对象的内存地址。但到目前为止我尝试的一切都失败了:
<code>package main import "fmt" var key1 = &struct{}{} var key2 = &struct{}{} var key3 = struct{}{} var key4 = struct{}{} var key5 = new(struct{}) var key6 = new(struct{}) func main() { fmt.Println("key1 == key2", key1 == key2) fmt.Println("key3 == key4", &key3 == &key4) fmt.Println("key5 == key6", key5 == key6) test(key1, key2, "func12") test(&key3, &key4, "func34") test(key5, key6, "func56") } func test(a, b any, msg string) { fmt.Println(msg, a == b) } </code>
打印
key1 == key2 true key3 == key4 false key5 == key6 true func12 true func34 true func56 true
因此,获取空结构变量的地址几乎是可行的,直到将其传递给函数为止。然后区别就消失了。
我不想引入密钥注册表,因为它是一个不必要的复杂化。我也不想使用字符串,因为库的不同使用者需要协商密钥或使用名称空间,并且需要散列和比较字符串也是不必要的复杂化。
有没有我没想到的方法?
解决方法
标准库在使用 context.Context
时使用了一个“技巧”:上下文能够在其中携带任意值,并且这些值使用 interface{}
进行键控(从一段时间以来 any
)1。然后,您自己的包可以为其将要使用的上下文键定义一个新的未导出类型,然后定义一组具有该类型的常量作为该包已知的上下文键。现在的技巧是,类型始终是 interface{}
类型的任何值的一部分,因此不可能创建与包的键冲突的接口值。
基本上是这样的:
package mypkg type contextKey int const ( KeyFoo = contextKey(iota) KeyBar )
现在,当您执行 key interface{} = KeyFoo
时,几乎可以保证程序中任何其他代码段都不能具有与 key
相同的值,因为其中一部分将(指向的内部指针)未导出输入 contextKey
。
您可能需要阅读这篇经典文章来了解其工作原理(虽然有点生疏,但仍然有 99% 的正确性) )。
对我来说,这看起来是一种前进的方式:您的包的用户可以生成自己的密钥并将其提交到您的地图,该地图的密钥类型应为 interface{}
或 any
。无需由集中式注册表来移交这些密钥。
1 请参阅 context.Context.Value() 和 context.WithValue() 了解更多信息。后者提供了有关如何生成密钥的更多提示。
以上是在 Go 中创建唯一映射键的最有效方法的详细内容。更多信息请关注PHP中文网其他相关文章!

Golang和Python的主要区别在于并发模型、类型系统、性能和执行速度。1.Golang使用CSP模型,适用于高并发任务;Python依赖多线程和GIL,适合I/O密集型任务。2.Golang是静态类型,Python是动态类型。3.Golang编译型语言执行速度快,Python解释型语言开发速度快。

Golang通常比C 慢,但Golang在并发编程和开发效率上更具优势:1)Golang的垃圾回收和并发模型使其在高并发场景下表现出色;2)C 通过手动内存管理和硬件优化获得更高性能,但开发复杂度较高。

Golang在云计算和DevOps中的应用广泛,其优势在于简单性、高效性和并发编程能力。1)在云计算中,Golang通过goroutine和channel机制高效处理并发请求。2)在DevOps中,Golang的快速编译和跨平台特性使其成为自动化工具的首选。

Golang和C 在执行效率上的表现各有优势。1)Golang通过goroutine和垃圾回收提高效率,但可能引入暂停时间。2)C 通过手动内存管理和优化实现高性能,但开发者需处理内存泄漏等问题。选择时需考虑项目需求和团队技术栈。

Golang更适合高并发任务,而Python在灵活性上更有优势。1.Golang通过goroutine和channel高效处理并发。2.Python依赖threading和asyncio,受GIL影响,但提供多种并发方式。选择应基于具体需求。

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。

selectgolangforhighpperformanceandcorrency,ifealforBackendServicesSandNetwork程序; selectpypypythonforrapiddevelopment,dataScience和machinelearningDuetoitsverserverserverserversator versator anderticality andextility andextentensivelibraries。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

禅工作室 13.0.1
功能强大的PHP集成开发环境

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver CS6
视觉化网页开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境