复杂数据类型作为 Go 中映射的键

2024-05-17

我正在尝试在 Go 中创建一个由大整数作为键的映射。 effective Go 明确指出:

结构体、数组和切片不能用作映射键,因为这些类型上没有定义相等性。

这是有道理的。我当然可以将大整数转换为字符串并使用字符串作为键,但我在这里寻找更通用的解决方案。我可以将我的结构包装到实现相等函数的东西(接口?)中并使用它吗?

当然,示例代码不起作用:

package main                                                                                                           

import (                                                                                                               
        "big"                                                                                                          
        "fmt"                                                                                                          
)                                                                                                                      

func main() {                                                                                                          
        one1 := big.NewInt(1)                                                                                          
        one2 := big.NewInt(1)                                                                                          

        hmap := make(map[*big.Int] int)                                                                                
        hmap[one1] = 2                                                                                                 
        _, exists := hmap[one2]                                                                                        
        fmt.Printf("Exists=%v\n", exists)                                                                              
}                                                                                                                      

关于平等的规则很快就会改变。来自Go 1 计划 https://docs.google.com/document/pub?id=1ny8uI-_BHrDCZv_zNBSthNKAMX_fR_0dc6epA6lztRE:

Go 1 将定义由以下组成的结构体和数组值的相等性 还定义了相等性的字段(逐元素比较)。 它将消除函数和映射值的相等性,除了 与零比较。 Go 1 将继续排除平等 切片。 (一般情况下这是不可行的。)

然而,即使有了这个规则,你也不能使用*BigInt作为键,因为它包含一个切片。另请注意,在 Go 中不可能编写自定义相等运算符(也不可能覆盖任何其他运算符)。但在我看来,这实际上是 Go 的优势——没有它,事情会变得更简单。

因此,您必须使用字符串作为键。但是,只要您不想打印字符串,就不需要将其格式化为十进制(或任何其他格式)。所以最快的方法可能是使用Bytes()方法(这也会丢弃该符号,请确保将其单独包含在字符串中)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复杂数据类型作为 Go 中映射的键 的相关文章

  • 在 OSX 上交叉编译 Go?

    我正在尝试在 OSX 上交叉编译 go 应用程序以构建适用于 Windows 和 Linux 的二进制文件 我已经阅读了网上能找到的所有内容 我发现的最接近的例子已经发布在 除了疯狂邮件列表上许多未完成的讨论之外 http solovyov
  • go build 不断抱怨:go.mod 有 post-v0 模块路径

    Go 1 11 发布后 我一直在尝试将我的存储库移动到 Go 模块 方法是添加go mod文件在其根目录下 我的根库之一my host root其版本为17 0 1 所以我在其中写道go mod file module my host ro
  • 带有导出字段的私有类型

    在 Go 教程的第二天有这样的练习 为什么拥有带有导出字段的私有类型会很有用 例如 package geometry type point struct X Y int name string 请注意point是小写的 因此不会导出 而字段
  • Goroutine 是如何工作的? (或者:goroutines 和操作系统线程的关系)

    其他 goroutine 如何在调用系统调用时继续执行 当使用 GOMAXPROCS 1 时 据我所知 当调用系统调用时 线程会放弃控制权 直到系统调用返回 Go 如何在不为每个阻塞系统调用 goroutine 创建系统线程的情况下实现这种
  • 将 Websocket 消息发送到 Go 中的特定通道(使用 Gorilla)

    我对 Go 很陌生 并且发现自己使用套接字作为我的第一个项目 这是一个多余的问题 但我无法理解如何将 websocket 更新发送到 Go 中的特定通道 使用 Gorilla 我在用此链接中的代码示例 https github com go
  • 限制 FormFile 中的文件大小

    我让用户使用 FormFile 上传文件 我应该在什么时候检查文件大小是否太大 当我做 file header fileErr r FormFile file 文件对象已经创建 那么我是否已经产生了读取整个文件的成本 https golan
  • K8s更改配置映射并更新应用程序日志级别

    我想更改在 K8S 上运行的 Golang 应用程序的登录配置 我在本地尝试了以下代码 它按预期工作 我正在使用 viper 来监视配置文件更改 这是带有日志配置的配置图 apiVersion v1 kind ConfigMap data
  • 如何获取文件的 ctime、atime、mtime 并更改它们

    如何使用 Go 获取文件的 ctime mtime atime 并更改它们 在 Go 1 1 2 中 os Stat只能获取mtime os Chtimes 可以更改 mtime 和 atime 但不能更改 ctime Linux ctim
  • Bash脚本无法执行Go命令

    我正在尝试编写一个 bash 脚本来自动在不同的目录中运行 go get install 相关部分在这里 cd web go get cd web go install cd services go get cd services go i
  • 如何自定义解析错误的 HTTP 400 响应?

    我编写了一个 REST API 服务 要求所有响应均为 JSON 但是 当 Go HTTP 请求解析器遇到错误时 它会返回 400 作为纯文本响应 而不会调用我的处理程序 例子 gt curl i H Authorization Basic
  • vscode 中的调试不会在断点处停止,调试器启动时显示“无法找到文件...”

    乌班图 vscode 1 62 1 去1 17 3 vscode go 扩展 v0 29 0 深入研究 v1 7 1 我是 vscode 和 Go 的新手 我有多年在 Eclipse 中调试 Java 应用程序的经验 我构建了一个小型多模块
  • 当变量更新时动态刷新模板的一部分golang

    在Golang中 当变量更新时可以刷新模板的一部分吗 例如 我们可以在 Angular js 中找到这一点 基本上在我的代码中 我通过 ajax 中的邮政编码查找地址 它显示我找到的该邮政编码的用户列表 Here is a sample o
  • 优化 golang 中的数据结构/字对齐填充

    与我在 C 中学到的类似 我相信填充导致了两个结构体实例大小的差异 type Foo struct w byte 1 byte x byte 1 byte y uint64 8 bytes type Bar struct x byte 1
  • 取消用户特定的 goroutine [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个应用程序 网络应用程序 允许用户使用 twitter oauth 登录并提供自动推文删除功能 用户登录到 Web 应用程序后
  • 视频第一帧

    我正在创建一个单页应用程序 后端使用 Golang 前端使用 javascript 我想找到一种使用 Golang 获取视频第一帧的方法 首先 我将 mp4 视频文件上传到服务器 它保存在服务器上 有没有办法使用 Golang 获取该视频的
  • 使用 testify 模拟接口方法两次,输入和输出不同

    如何在 golang 测试中模拟接口方法两次 例如 type myCache interface Get key string data interface error type service struct cache myCache f
  • 如何在C#中执行Go函数

    有没有办法从 C 执行 Go 函数 例如 对于 Python 我会使用 Ironpython 我知道我可以生成一个进程来执行 Go 脚本 但如果可能的话 我真的不想回退到这样的解决方案 Google 搜索没有显示任何内容 那么有什么方法可以
  • 在 Go 中使用电子邮件地址创建证书签名请求 (CSR)

    我尝试使用 crypto x509 包生成 CSR 但没有找到将 emailAddress 字段添加到其主题中的方法 根据文档证书申请 http golang org pkg crypto x509 CertificateRequest结构
  • Go 的范围不能超过 (类型接口 {})

    我正处于尝试将我的注意力集中在 Go 上的婴儿阶段 目前 我正在模拟一个 API 请求 该请求返回包含对象数组的 JSON 格式的字符串 我试图找出迭代每个记录并访问每个字段的最合适的方法 最终 每个字段都将写入 Excel 电子表格 但现
  • 使用覆盖率信息测试 Go 中的 os.Exit 场景 (coveralls.io/Goveralls)

    这个问题 如何在 Go 中测试 os exit 场景 https stackoverflow com questions 26225513 how to test os exit scenarios in go 以及其中得票最高的答案 列出

随机推荐