【问题标题】:Complex datatypes as keys in maps in Go复杂数据类型作为 Go 地图中的键
【发布时间】:2011-12-25 15:54:21
【问题描述】:

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

【问题讨论】:

  • 这不仅仅是平等。 map是一个哈希表,所以每个key类型也需要一个哈希函数
  • 是的。而且我忘记了,因为 big.Int 是可变的(我不喜欢)将它们放在哈希表中可能不是那么聪明。也许我应该坚持使用函数式编程:)

标签: go


【解决方案1】:

关于平等的规则很快就会改变。来自Go 1 plan

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2010-09-17
    • 1970-01-01
    • 2011-05-02
    • 2013-10-30
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多