我正在尝试在 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(使用前将#替换为@)