最直接可靠的方式是用 for 循环遍历数组;Go 1.21+ 的 slices.Contains 仅支持切片,数组需显式转为 arr[:] 才能使用,且泛型函数因长度参数限制实用性有限。
用
循环遍历是最直接可靠的方式
Go 没有内置的
函数(直到 Go 1.21 才在
包里提供,但仅限切片,且不支持数组),所以对数组必须手动遍历。数组长度固定、类型明确,
配合
或自定义比较逻辑最稳妥。
常见错误是误把数组当切片传给
,导致编译失败——因为
和
是完全不同的类型。
对基本类型(如
、
)直接用
比较
对结构体或指针,需自行实现相等逻辑(比如逐字段比对或用
,但注意性能开销)
若数组很大且查找频繁,考虑提前转成
做 O(1) 查找,但要注意内存和初始化成本
只适用于切片,不能直接用于数组
Go 1.21+ 引入了
包,但它的
函数签名是
,其中
必须是切片类型。数组无法隐式转换为切片,必须显式切片转换:
注意:
不会拷贝底层数组,只是创建新切片头,开销极小;但该切片仍受原数组生命周期约束。
立即学习
“
go语言免费学习笔记(深入)
”;
自定义泛型函数能复用且类型安全
如果项目中多次需要查数组,写一个泛型函数比重复写
更清晰。利用
约束可覆盖大部分场景:
缺点是目前 Go 泛型不支持「任意长度数组」作为类型参数(
中
必须是具体常量),所以每个不同长度的数组都需要单独实例化,实际中不如直接写循环灵活。
字符串数组查子串时别混淆
遇到
类型,容易下意识用
,但它只作用于单个
,不是字符串集合。正确做法仍是遍历 +
或
:
✅ 判断子串
✅ 判断元素是否存在(需先转切片)
❌ 编译失败:
是
,不是
数组维度和类型边界在 Go 里非常严格,稍不注意就会卡在类型转换上——尤其是从切片思维切换回数组时,
这一步最容易被忽略。
forcontainsslicesfor==slices.Contains[3]int[]intintstring==reflect.DeepEqualmapslices.ContainsslicesContainsfunc Contains[S ~[]E, E comparable](s S, v E) boolSarr := [3]string{"a", "b", "c"}
found := slices.Contains(arr[:], "b") // ✅ 正确:arr[:] 转为 []string
// found := slices.Contains(arr, "b") // ❌ 编译错误:cannot use arr (variable of type [3]string) as []string value
arr[:]forcomparablefunc ContainsArray[T comparable](arr [N]T, v T) bool {
for _, item := range arr {
if item == v {
return true
}
}
return false
}
// 使用示例:
found := ContainsArray([3]int{1, 2, 3}, 2)
[N]TNstrings.Contains[]stringstrings.Containsstringstrings.Contains==strings.Contains("hello", "ll")slices.Contains(myStrings, "target")strings.Contains(myStrings, "target")myStrings[]stringstring[:]