GO语言中哪些类型是可比较类型的(==和!=)

在做这道力扣题目的时候,用到了数组的==操作,所以我对可比较类型产生了疑惑:
438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

题解:

Go 复制代码
func findAnagrams(s string, p string) []int {
	var result []int
	if len(s) < len(p) {
		return result
	}

	// 用固定长度数组统计字符频次,Go 中 [26]int 可以直接用 == 比较
	var need [26]int   // 目标字符串 p 的字符需求
	var window [26]int // 当前窗口内的字符统计

	// 先统计 p 中各字符出现次数
	for i := 0; i < len(p); i++ {
		need[p[i]-'a']++
	}

	left := 0 // 窗口左边界

	// right 作为窗口右边界,从左向右逐位扫描字符串 s
	for right := 0; right < len(s); right++ {

		// 1. 扩大窗口:将 s[right] 加入当前窗口统计
		window[s[right]-'a']++

		// 2. 收缩窗口:当窗口内字符数量超过 len(p) 时,left 右移
		//    始终保持窗口大小 <= len(p)
		//    窗口当前大小 = right - left + 1
		if right-left+1 > len(p) {
			window[s[left]-'a']-- // 将左边界的字符移出窗口
			left++                // 左边界右移一位
		}

		// 3. 检查:此时窗口大小恰好等于 len(p)(或初始阶段小于 len(p))
		//    当窗口大小不足 len(p) 时,window 不可能等于 need,不会误触发
		//    当窗口大小恰好为 len(p) 时,直接比较两个数组
		if window == need {
			// 找到一个异位词,记录其起始位置(即当前 left 的位置)
			result = append(result, left)
		}
	}

	return result
}

在 Go 语言中,可比较(comparable) 的类型是指可以直接使用 ==!= 运算符进行相等性判断的类型。

根据 Go 语言规范,以下类型是 可以直接 == 比较 的:

1. 基本类型

  • 布尔型bool

  • 整数型int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr

  • 浮点型float32, float64(注意:NaN != NaN,这是 IEEE 754 标准规定)

  • 复数型complex64, complex128

  • 字符串型string

2. 复合类型(有条件可比较)

  • 数组(Array)当且仅当数组的元素类型是可比较的,且两个数组长度相同时 ,可以直接用 == 比较。 ✅ 代码中的 [26]int 就是典型的例子------int 可比较,数组长度固定为 26,所以 window == need 完全合法。

  • 结构体(Struct)当且仅当结构体的所有字段都是可比较类型时 ,整个结构体可以直接用 == 比较。

3. 引用类型(部分可比较)

  • 指针(Pointer):比较的是内存地址是否相同。

  • 通道(Channel):比较的是两个通道是否引用同一个底层通道结构。

  • 接口(Interface) :当两个接口的动态类型都是可比较类型,且动态值相等时,==true。如果动态类型包含切片、map、函数等不可比较类型,运行时会发生 panic。


❌ 不可直接用 == 比较的类型

以下类型绝对不可以 直接使用 ==

类型 原因
切片(Slice) 长度不固定,底层引用内存,Go 禁止直接比较
映射(Map) 底层哈希表,无固定顺序,Go 禁止直接比较
函数(Func) 函数值不可比较(只能与 nil 比较)

如果你想比较切片或 map 的内容是否相同,必须手动遍历元素逐一比较,或使用 reflect.DeepEqual()(但性能较差,不推荐在热路径使用)。


关于代码中的数组比较

复制代码
var need [26]int
var window [26]int
// ...
if window == need {  // ✅ 完全合法

这里 [26]int数组 (Array),不是切片(Slice)。数组在 Go 中是值类型,长度是类型的一部分,[26]int[27]int 是两种不同的类型。因为 int 可比较,所以由 int 组成的固定长度数组也可比较。

常见误区 :很多初学者会把 []int(切片)和 [26]int(数组)混淆,切片是不能用 == 比较的,但数组可以。

相关推荐
147API3 分钟前
Python批量生成蒸馏数据,并发、重试、幂等和断点续跑
开发语言·jvm·python
青 春 记 忆5 分钟前
零基础入门python04:用注册校验理解字典、集合和条件判断
开发语言·vscode·python·python3.11
952368 分钟前
Sentinel
java·后端·spring·sentinel·springcloud
kels88999 分钟前
实战排坑:黄金实时API开发,XAUUSD Tick报文异常处理实践
开发语言·python·websocket·网络协议·信息可视化
阿pin13 分钟前
Java随笔-JDK7 HashMap头插法为何能导致死循环?
java·开发语言·hashmap
FBI HackerHarry浩16 分钟前
Pandas 库中用于分类变量独热编码(One-Hot Encoding)的函数 pd.get_dummies() 函数
开发语言·人工智能·python·pandas
名字还没想好☜30 分钟前
Go 的 sync.Cond 实战:用条件变量做等待/通知,比忙轮询省 CPU
开发语言·数据库·后端·golang·go
zzzll11111 小时前
Spring Boot 入门指南:从零开始构建微服务
spring boot·后端·微服务
运维行者_1 小时前
企业带宽监控工具实战:网络流量分析与异常排查的5个关键能力
运维·服务器·开发语言·网络·分布式·后端·php
Patrick在香港1 小时前
Python爬虫框架实战:优雅抓取香港政府公开API数据的通用方案
java·开发语言·爬虫·python·ai编程·数据可视化·可用性测试