You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言泛型是否支持将任意大小数组作为函数参数?

Go泛型支持任意大小数组作为函数参数的正确实现

在Go 1.18引入泛型后,确实可以编写接受任意大小数组的函数,但你的代码存在两个关键问题:

错误原因分析

  1. 类型参数声明顺序错误:数组类型[N]V依赖于长度N和元素类型V,你需要先声明N和V,再声明基于它们的数组类型参数A,否则编译器无法推断依赖的类型参数,导致"cannot infer V"的错误。
  2. 数组长度的类型约束问题:虽然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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 07:51:06