go语言学习十三 - 相等性

本文探讨了Go语言中接口、结构体、数组及切片等数据类型的相等性比较规则。对于接口,只要方法列表相同即视为相等;而结构体必须是相同类型且字段值全部相同才相等;数组需长度相同且对应位置元素相等;切片不能直接比较相等性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package main

import "fmt"

func main() {

	//接口的相等性比较
	type a interface {
		aaa() int
		bbb() int
	}

	type b interface {
		bbb() int
		aaa() int
	}

	var x a
	var y b
	fmt.Println(x == y) //true 对于接口,只要方法列表相同,即使顺序不同也是同一个接口,可以互相替换

	//结构体的相等性比较

	type aa struct {
		aaa int
		bbb int
	}

	type bb struct {
		aaa int
		bbb int
	}

	var xx aa
	var yy bb
	//fmt.Println(xx == yy) 不同的命名结构体相互比较,无法通过编译, 命名结构体 只要不是同一个名字的结构体即使结构相同也是不同的类型,不可互相替换
	fmt.Println(xx, yy)

	x1 := aa{1, 2}
	x2 := aa{1, 2}
	fmt.Println(x1 == x2) //true , 对于相同类型的结构体,只要字段值全部相同,那么这两个结构体值相等

	//数组的相等性比较

	y1 := [4]int{1, 2, 3, 4}
	y2 := [4]int{1, 2, 3, 4}
	y3 := [3]int{1, 2, 3}
	fmt.Println(y1 == y2) //true , 对于相同长度的数组,相同索引位置的值都相等,那么这两个结构体值相等
	fmt.Println(y1, y3)   // fmt.Println(y1 == y3) 不同长度的数组相等性相互比较,无法通过编译

	//切片的相等性比较

	z1 := []int{1, 2, 3}
	z2 := []int{1, 2, 3}
	z3 := z1
	fmt.Println(z1, z2) // fmt.Println(z1 == z2) 切片之间的相等性比较,无法通过编译,operation == not defined on []int
	fmt.Println(z3)     // fmt.Println(z1 == z3) 比较引用的相等性也不能通过编译

	z4 := &z1
	z5 := &z1
	fmt.Println(z4 == z5) //同类型的指针是可以比较的,比较的是他们的地址是否相同,不同类型的指针也不能比较相等

	//由于go不支持运算符重载,> < >= <= 只能用于数值和字符串类型
}

  

转载于:https://www.cnblogs.com/scala/p/9592628.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值