一尘不染

复杂的数据类型作为Go中地图中的键

go

我正在尝试在Go中创建一个以大整数为键的地图。有效的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)                                                                              
}

阅读 196

收藏
2020-07-02

共1个答案

一尘不染

有关平等的规则即将改变。从Go 1计划中

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

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

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

2020-07-02