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

是否可以为命名的类型/结构定义相等性?

公冶威
2023-03-14
问题内容

阅读了有关在地图中使用切片的相关问题之后,我对Go中的相等性感到好奇。

我知道有可能重写equalsJava方法Object。有没有类似的方法来定义Go如何检查用户定义的类型/结构是否相等?如果是这样,将有一个针对上述问题的解决方法。我以为使用interface{}值可能会提供解决方案,但我收到了错误消息panic:runtime error: hash of unhashable type []int


问题答案:

Go支持相等性检查结构。

type Person struct {
    Name string
}

a := Person{"Bill DeRose"}
b := Person{"Bill DeRose"}

a == b // true

它不能与指针字段一起使用(按照您想要的方式),因为指针地址不同。

type Person struct {
    Friend *Person
}

a := Person{Friend: &Person{}}
b := Person{Friend: &Person{}}

a == b // false

您无法修改相等运算符,也没有内置的方式来添加对使用==语法的自定义类型的支持。相反,您应该使用比较指针值reflect.DeepEqual

import "reflect"

a := Person{Friend: &Person{}}
b := Person{Friend: &Person{}}

reflect.DeepEqual(a, b) // true

请记住,有一些警告。

通常,DeepEqual是Go的==运算符的递归松弛。但是,如果没有一些不一致,就不可能实现这个想法。具体来说,可能是由于值是func类型(通常无法比较)或因为它是浮点NaN值(在浮点比较中不等于其自身),或者与它不相等。它是包含此类值的数组,结构或接口。



 类似资料:
  • 4.4.2 结构类型的定义 重复说明符DUP只能用于重复同一数据类型的变量说明,它不可以重复不同数据类型的变量说明。为了把一组不同类型的变量说明组合在一起,汇编语言提供了另一种复合数据类型说明符——结构类型说明符STRUC。 1、结构类型的定义 用STRUC和ENDS可以把一系列数据定义语句括起来作为一种新的、用户定义的结构类型。其一般说明格式如下: 结构名 STRUC [Alignment][,

  • 我有一个支持以下操作的数据结构: 可以在固定时间内插入项目。对于该项,数据结构分配一个唯一的正整数。(说明:指定的整数不是插入项的函数,用户对指定的整数没有选择权。它完全由数据结构选择。) 它是使用指针数组实现的,其中指定的整数是存储项的索引。未使用的索引以链表方式链接起来,以便进行固定时间的插入。 这种数据结构的名称是/应该是什么?

  • 问题内容: 假设我有两种类似的类型设置为: 知道它们具有相同的字段,是否有直接的方法将值从类型1写入类型2?(除了编写将所有字段从源复制到目标的循环外) 谢谢。 问题答案: 对于您的特定示例,您可以轻松地将其转换:

  • 问题内容: 假设我有2个结构: 我想反映扩展结构来获取它的领域: 问题答案: 只需检查值的Kind()

  • 结构体(structure,缩写成 struct)有 3 种类型,使用 struct 关键字来创建: 元组结构体,总的来说是根据元组来命名。 C 语言风格的结构体 c_struct。 单元结构体,不带字段,在泛型中很有用。 // 单元结构体 struct Nil; // 元组结构体 struct Pair(i32, f32); // 带有两个字段的结构体 struct Point { x:

  • 问题内容: 我想创建一个从(a)类类型到(b)long(已定义类类型的对象的标识符)到(c)对象本身的映射。 我有以下内容: 是否有可能以某种方式表示第一个必须与第二个具有相同的类型?我期待这样的事情,但这当然是不可能的: 问题答案: 作为替代方案,您可以使用少量的非类型安全代码以强制执行约束的方式封装: 该在不需要编译器不会抱怨,但它会帮助赶上了错误的类型进入缓存早期的对象。