赞
踩
如下:
package tuple type Tuple[T any, U any] struct { First T Second U } // zip combines elements of two slices into a slice of pairs (tuples), which is useful for combining related data. func Zip[T any, U any](slice1 []T, slice2 []U) []Tuple[T, U] { length := min(len(slice1), len(slice2)) result := make([]Tuple[T, U], length) for i := 0; i < length; i++ { result[i] = Tuple[T, U]{First: slice1[i], Second: slice2[i]} } return result } func min(a, b int) int { if a < b { return a } return b }
这段 Go 代码定义了一个通用的 Tuple 类型和一个 Zip 函数,用于将两个切片的元素组合成一系列的元组。下面是详细分析:
package tuple
type Tuple[T any, U any] struct {
First T
Second U
}
First
和 Second
。T
和 U
是类型参数,使用 any
作为约束,这意味着它们可以是任何类型。func Zip[T any, U any](slice1 []T, slice2 []U) []Tuple[T, U] {
length := min(len(slice1), len(slice2))
result := make([]Tuple[T, U], length)
for i := 0; i < length; i++ {
result[i] = Tuple[T, U]{First: slice1[i], Second: slice2[i]}
}
return result
}
函数签名
Zip
函数也是泛型的,它接受两个类型参数 T
和 U
。Tuple[T, U]
的切片。length := min(len(slice1), len(slice2))
计算两个切片的最小长度,这样可以避免越界访问。min 函数在代码中没有定义,假设它是一个返回两个整数中较小值的辅助函数。
result := make([]Tuple[T, U], length)
创建一个长度为 length 的 Tuple[T, U] 切片,用于存储结果。
for i := 0; i < length; i++ {
result[i] = Tuple[T, U]{First: slice1[i], Second: slice2[i]}
}
使用循环遍历两个切片,在每个位置创建一个新的 Tuple,将对应位置的元素组合在一起。
return result
ints := []int{1, 2, 3}
strings := []string{"a", "b", "c", "d"}
tuples := Zip(ints, strings)
[]Tuple[int, string]{
{First: 1, Second: "a"},
{First: 2, Second: "b"},
{First: 3, Second: "c"},
}
注意,由于 ints 切片的长度小于 strings 切片的长度,结果切片的长度与较短的切片一致。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。