我正在尝试在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) }
有关平等的规则即将改变。从Go 1计划中:
Go 1将在结构和数组值上定义相等性,这些值由也定义相等性的字段组成(逐元素比较)。除了与nil比较外,它将删除函数和映射值的相等性。Go 1将继续排除切片的相等性。(在一般情况下是不可行的。)
但是,即使有此规则,您也不能将其*BigInt用作键,因为它包含一个切片。还要注意,在Go中不可能编写自定义的相等运算符(不能覆盖任何其他运算符)。但是在我看来,这实际上是Go的优势- 没有它,事情就更简单了。
*BigInt
因此,您将必须使用字符串作为密钥。但是,只要您不想打印字符串,就不需要将其格式化为十进制(或任何其他格式)。因此,最快的方法可能是使用Bytes()方法(该方法也会丢弃符号,请确保将其单独包含在字符串中)。
Bytes()