当前位置: 首页 > 面试题库 >

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

洪河
2023-03-14
问题内容

我正在尝试在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的优势-
没有它,事情就更简单了。

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



 类似资料:
  • pg 相对于其它关系型数据库的一大优势就在于成熟的复杂类型支持,包括数组、JSON 对象、HStore 等等。 Array pg 的数组功能非常强大,支持类型数组、多维数组、定长数组。 定义一个简单的数组列: CREATE TABLE sample_table ( array_example integer[], ); 对应插入语句: INSERT INTO sample_table

  • 如何查询具有复杂类型(如映射/数组)的RDD?例如,当我编写此测试代码时: 我认为语法应该是这样的: 或 但我明白了 无法访问类型MapType(StringType,StringType,true)中的嵌套字段 和 组织。阿帕奇。火花sql。催化剂错误。包$TreeNodeException:未解析的属性 分别地

  • 问题内容: 我一直在研究使用结构作为golang映射中的键。此结构中的一个字段也应该是一个映射,这似乎与此处提供的文档背道而驰,该文档只说那些具有可与之进行比较的字段且可以在用作映射中键的结构的字段中的结构。但是,我继续尝试以下方法: 输出为: 这似乎违反了文档,因为用作键的结构中的字段是映射。我似乎出了什么问题? 问题答案: 在您的示例中,映射键是指向结构的指针,而不是结构本身。即使指针指向的项

  • 我需要一个(,)对的队列。这很简单: Go中是否有内置的对/元组数据类型?支持从函数返回多个值,但AFAICT,生成的多个值元组不是Go类型系统中的一等公民。是这样吗? 至于“你尝试过什么”部分,显而易见的语法(来自Python程序员的POV) 没有工作。

  • 我想做一个自动视频生成的东西。目前我这样做的方式是使用editly节点库,它需要一个对象。现在我想从一个文件夹中获取音乐/音频,然后我想获取每个文件的持续时间,这样我就可以动态地将其剪辑在一起。 问题是我想返回一个对象到Array.map函数,该对象在回调中被编辑。但是当我返回对象(在我的脑海中应该被编辑)时,它返回默认值。 以下是我目前的代码: 更新:以下是新的工作代码:

  • 我想创建一个使用时间戳作为范围键的表,以便轻松地按日期对数据进行排序。 纪元格式似乎是最容易使用的- 在javascript中,我使用的是新日期()。获取UTC时间。 我的问题是在DynamoDB中保存日期的更好的数据类型是什么,字符串还是数字? 在这里和这里找到了一些AWS的参考资料,它们说可以使用数字作为时间戳的类型,因为它是所有数字的类型,包括长的。 当我按日期查询时会有什么不同吗?我正在寻