首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Go中映射中作为键的复杂数据类型

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

Stack Overflow用户
提问于 2019-06-14 05:05:11
回答 1查看 0关注 0票数 0

我正在尝试在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)                                                                              
}                                                                                                                      
EN

回答 1

Stack Overflow用户

发布于 2019-06-14 14:18:38

关于平等的规则将很快改变。从Go 1计划

Go 1将定义结构和数组值的相等性,这些值由定义了相等性的字段组成(逐元素比较)。除了与nil进行比较之外,它将删除函数和映射值的相等性。Go 1将继续排除切片的相等性。(在一般情况下,这是不可行的。)

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档