Go泛型中如何指定数组作为类型约束?
Go泛型中数组作为类型约束的实现方案
1. 能否指定固定长度数组作为类型约束?
完全可以。Go的泛型支持将具体长度的数组类型(比如[32768]byte、[100]uint64)直接作为类型约束,用于限定泛型函数的参数类型。
示例代码:
package main import "fmt" // 处理固定长度32768的byte数组,统计非零元素数量 func CountNonZero(arr [32768]byte) int { count := 0 for _, b := range arr { if b != 0 { count++ } } return count } // 用泛型约束固定长度100的uint64数组,求和 func SumFixedUint64[T [100]uint64](arr T) uint64 { sum := uint64(0) for _, num := range arr { sum += num } return sum } func main() { var buf [32768]byte buf[10] = 1 fmt.Println(CountNonZero(buf)) // 输出1 var nums [100]uint64 nums[0] = 5 nums[1] = 15 fmt.Println(SumFixedUint64(nums)) // 输出20 }
2. 处理多种不同长度的数组类型
如果需要兼容任意长度的同类型数组,可以把数组的长度N也声明为泛型参数,配合元素类型T一起构建约束,这样就能覆盖所有长度的该类型数组。
示例代码:
package main import "fmt" // 处理任意长度的任意类型数组,返回数组长度 func GetArrLength[T any, N int](arr [N]T) int { return N } // 求和任意长度的uint64数组 func SumAnyUint64[N int](arr [N]uint64) uint64 { sum := uint64(0) for _, num := range arr { sum += num } return sum } func main() { smallArr := [3]int{1,2,3} fmt.Println(GetArrLength(smallArr)) // 输出3 largeArr := [1000]uint64{1,2,3,4,5} fmt.Println(SumAnyUint64(largeArr)) // 输出15 }
如果需要限制元素类型为特定类别(比如所有整数),可以结合constraints包的预定义约束:
import "golang.org/x/exp/constraints" // 求和任意长度的整数类型数组 func SumAnyInt[T constraints.Integer, N int](arr [N]T) T { var sum T for _, num := range arr { sum += num } return sum }
内容的提问来源于stack exchange,提问作者qeatzy
相关产品推荐
相关产品推荐

