Go语言泛型是否支持将任意大小数组作为函数参数?
Go泛型支持任意大小数组作为函数参数的正确实现
在Go 1.18引入泛型后,确实可以编写接受任意大小数组的函数,但你的代码存在两个关键问题:
错误原因分析
- 类型参数声明顺序错误:数组类型
[N]V依赖于长度N和元素类型V,你需要先声明N和V,再声明基于它们的数组类型参数A,否则编译器无法推断依赖的类型参数,导致"cannot infer V"的错误。 - 数组长度的类型约束问题:虽然
N int能处理标准场景,但更严谨的是用~int作为约束(匹配所有整型类型,包括自定义整型别名),不过仅用int也能适配常规数组长度的情况。
正确实现方式
方式一:直接使用数组类型作为参数
无需单独声明数组类型参数A,直接将[N]V作为函数参数类型,写法更简洁:
package main import "fmt" func bar[N int, V comparable](array [N]V) { fmt.Println(array) } func main() { bar([3]int{1, 2, 3}) // 输出 [1 2 3] bar([5]string{"a", "b", "c"}) // 输出 [a b c ] }
方式二:声明数组类型参数
如果需要复用数组类型A,调整类型参数顺序即可:
package main import "fmt" func foo[N int, V comparable, A [N]V](array A) { fmt.Println(array) } func main() { foo([4]float64{1.1, 2.2, 3.3}) // 输出 [1.1 2.2 3.3 0] }
关键说明
- 泛型函数可以接受任意长度、任意可比较元素类型的数组(若不需要元素可比较,可移除
comparable约束)。 - 调用时无需显式指定类型参数,编译器会自动推断
N和V的值。
内容的提问来源于stack exchange,提问作者CodeDude
相关产品推荐
相关产品推荐

