如何合并两个返回数组为新数组,保留编译期信息且支持长度可变?
编译期合并固定长度数组的方案
针对你提出的合并固定长度数组且保留编译期信息的需求,在Go 1.18+中可以通过泛型+编译期常量推导实现完全适配长度变化的合并方法,具体如下:
核心实现:泛型合并函数
利用Go的泛型特性,编写一个支持任意长度固定数组的合并函数,编译期会自动推导合并后的数组长度:
func Merge[T any, Len1, Len2 int](arr1 [Len1]T, arr2 [Len2]T) [Len1 + Len2]T { var merged [Len1 + Len2]T copy(merged[:Len1], arr1[:]) copy(merged[Len1:], arr2[:]) return merged }
使用方式
直接传入foo()和bar()的返回值即可,编译期会自动计算合并后的数组长度:
combined := Merge(foo(), bar()) // 当foo返回[2]func()、bar返回[3]func()时,combined类型为[5]func() // 若后续foo返回长度改为4、bar改为5,combined会自动变为[9]func(),无需修改合并逻辑
特性说明
- 编译期信息完全保留:
Len1和Len2是编译期常量,因此Len1+Len2也会被编译器视为常量,合并后的数组长度在编译阶段就已确定,完全满足后续编译器展开数组的需求。 - 自动适配长度变化:只要
foo()和bar()返回的仍是固定长度数组,无论长度如何修改,合并函数都会自动推导新的合并后长度,无需手动调整代码。 - 类型安全:泛型会确保传入的两个数组元素类型一致,编译阶段就能拦截类型不匹配的错误。
内容的提问来源于stack exchange,提问作者abergmeier
相关产品推荐
相关产品推荐

