文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在 Go 中创建唯一映射键的最有效方法

2024-02-11 17:26

关注

在Go语言中,创建唯一映射键的最有效方法一直是开发者们关注的问题。在面对需要保证键的唯一性的场景时,我们需要寻找一种高效且可靠的方法。php小编百草将在本文中分享一种最有效的方法,帮助您在Go语言中创建唯一映射键,让您的代码更加优化和高效。无论是处理大规模数据还是实现高并发的应用,这些方法都能帮助您提高性能和效率。让我们一起来了解吧!

问题内容

我在图书馆的某个地方有一个 map[any]SomeType 。我希望库用户能够为该地图创建键,以便保证它们在单个应用程序执行中不会发生冲突,并且我希望这些键能够高效地进行地图查找。

首先想到的是使用某个唯一的空对象的内存地址。但到目前为止我尝试的一切都失败了:

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)
}

打印

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 中创建唯一映射键的最有效方法的详细内容,更多请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯