Go语言 struct结构体 能比较么 == 或 !=

同一个struct的2个实例能不能比较 ==  !=

答案:可以能、也可以不能

两个不同的struct的实例能不能比较 ==  !=

答案:可以能、也可以不能

虽然答案都一样,但是涉及到的知识点略有不同

如果结构体的所有成员变量都是可比较的,那么结构体就可比较

如果结构体中存在不可比较的成员变量,那么结构体就不能比较

结构体之间进行转换需要他们具备完全相同的成员(字段名、字段类型、字段个数)

大家注意看上图

t1 t2 是同一个struct的2个赋值相同的实例

他们本质就是结构体的一个“对象”,因为成员变量带有了不能比较的成员,所以只要写 == 就报错

t3 t4 虽然能用 == ,但是人家本质上是比较的指针类型,*t3 == *t4 一样的一写就报错

至于 

func DeepEqual(a1, a2 interface{}) bool

这个大家今后再展开细讲,我们只说,这个方法比较指针类型深度是否一致的情况

1: 指针1 == 指针2 结果为true

2: 指针1 指针2 所指向的值深度相等

满足其中的一条即 DeepEqual 结果为true

== 如果用来比较指针,比较的就是指针所指向的内存地址,而不是指针变量本身所在的内存地址

这一点你可以理解为和Java中 (对象 == 对象) 是一个道理的

既然2个指针所指向的内存都一样了,怎么可能不相等呢?

但是说了这么多,回到问题的本质,

虽然 DeepEqual方法可以达到比较值是否相等这样的效果,

但是对于结构体实例而言,因为含有不能比较的成员变量,所以 == 和 != 是不能用的

这里又延伸出来一个知识点

struct可以作为map的key么?

答案:可以,也不可以

struct必须是可比较的,才能作为key,否则编译时报错

什么是可比较

文档规范:https://golang.org/ref/spec#Comparison_operators

 

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Go语言中,可以使用`struct`关键字来创建结构体结构体是一种自定义的数据类型,它可以包含多个字段,每个字段可以具有不同的类型。以下是一个创建结构体的示例代码: ```go type Person struct { Name string Age int } ``` 该代码定义了一个名为Person的结构体,其中包含了两个字段:Name和Age。Name字段是一个字符串类型,Age字段是一个整数类型。要创建一个Person实例,可以使用以下代码: ```go person := Person{Name: "John", Age: 35} ``` 这将创建一个名为person的Person对象,其中Name字段设置为“John”,Age字段设置为35。要访问结构体中的字段,可以使用点符号。例如,要访问person对象的Name字段,可以使用以下代码: ```go name := person.Name ``` 这将将person对象的Name字段的值分配给name变量。同样,要访问Age字段,可以使用以下代码: ```go age := person.Age ``` 以上是如何创建和访问结构体的示例。在Go语言中,还可以使用匿名字段来创建嵌套结构体。例如,以下是一个示例代码,其中Person结构体嵌套了Address结构体: ```go type Address struct { Street string City string Country string } type Person struct { Name string Age int Address Address } ``` 在此示例中,Person结构体中包含了一个Address字段,该字段是一个Address结构体类型。要创建一个包含Address字段的Person对象,可以使用以下代码: ```go person := Person{ Name: "John", Age: 35, Address: Address{ Street: "123 Main St", City: "Anytown", Country: "USA", }, } ``` 这将创建一个Person对象,其中包含了Name、Age和Address字段。Address字段是一个Address结构体类型,并具有Street、City和Country字段。要访问Person对象中嵌套的Address结构体中的字段,可以使用以下代码: ```go street := person.Address.Street city := person.Address.City country := person.Address.Country ``` 这将将Person对象中嵌套的Address结构体中的Street、City和Country字段的值分配给street、city和country变量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值