【golang】Golang手写元组 tuple | golang tuple

Golang手写元组 tuple

1、源码

如下:

go 复制代码
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
}

2、分析

这段 Go 代码定义了一个通用的 Tuple 类型和一个 Zip 函数,用于将两个切片的元素组合成一系列的元组。下面是详细分析:

2.1、Tuple 结构体

go 复制代码
package tuple

type Tuple[T any, U any] struct {
	First  T
	Second U
}
  • 这定义了一个泛型的 Tuple 结构体,它包含两个字段 FirstSecond
  • TU 是类型参数,使用 any 作为约束,这意味着它们可以是任何类型。
  • 通过这种方式,你可以创建包含任意类型数据对的元组,例如 Tupleint, string 或 Tuplefloat64, bool

2.2、Zip 函数

go 复制代码
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 函数也是泛型的,它接受两个类型参数 TU
  • 参数 slice1 是类型为 T 的切片,参数 slice2 是类型为 U 的切片。
  • 返回值是一个包含 Tuple[T, U] 的切片。

2.3、函数实现

1) 计算最小长度:
go 复制代码
length := min(len(slice1), len(slice2))

计算两个切片的最小长度,这样可以避免越界访问。min 函数在代码中没有定义,假设它是一个返回两个整数中较小值的辅助函数。

2) 创建结果切片:
go 复制代码
result := make([]Tuple[T, U], length)

创建一个长度为 length 的 TupleT, U 切片,用于存储结果。

3) 填充结果切片:
go 复制代码
for i := 0; i < length; i++ {
    result[i] = Tuple[T, U]{First: slice1[i], Second: slice2[i]}
}

使用循环遍历两个切片,在每个位置创建一个新的 Tuple,将对应位置的元素组合在一起。

4) 返回结果:
go 复制代码
return result

3、示例使用

3.1、假设你有以下两个切片:

go 复制代码
ints := []int{1, 2, 3}
strings := []string{"a", "b", "c", "d"}

3.2、调用 Zip 函数:

go 复制代码
tuples := Zip(ints, strings)

3.2、tuples 的内容将是:

go 复制代码
[]Tuple[int, string]{
    {First: 1, Second: "a"},
    {First: 2, Second: "b"},
    {First: 3, Second: "c"},
}

注意,由于 ints 切片的长度小于 strings 切片的长度,结果切片的长度与较短的切片一致。

相关推荐
名字还没想好☜3 分钟前
Go 的 io.Reader/Writer 组合实战:io.Copy、TeeReader、MultiWriter 优雅处理数据流
开发语言·后端·golang·go·iphone
郝学胜-神的一滴15 分钟前
Qt 高级编程 042:进度条从入门到自定义美化
开发语言·c++·qt·软件开发·用户界面
鸿芯微控科技24 分钟前
压电纳米定位分辨率怎么测?噪声、带宽、最小可检测位移与Python分析
开发语言·python·噪声分析·压电执行器·纳米定位·位移测量
喵个咪26 分钟前
GoWind Shop 架构剖析:一个 REST 请求穿越三服务 BFF 的七环链路
vue.js·后端·go
喵个咪27 分钟前
GoWind Shop 安全设计:JWT 鉴权、Ent 行级隔离、防篡改审计与四个真实漏洞修复
vue.js·后端·go
喵个咪29 分钟前
GoWind Shop:一个 proto 文件如何生成后端、前端、文档、校验六路代码
vue.js·后端·go
用户77833661321130 分钟前
从 0 搭一个关键词排名监控:核心思路 + 可运行代码
后端·python·api
喵个咪32 分钟前
GoWind Shop 出海实战:多语言商品内容怎么存、怎么录、怎么按 locale 取
vue.js·后端·go
@小匠1 小时前
Spring Boot Nacos绑定 Map 时中文 key 导致启动失败:一次从复现到源码的排查实录
java·开发语言·前端
Knight_AL1 小时前
Lombok @Builder 踩坑:build() 前后对象类型不一样
android·java·开发语言