大家好 , 我是 polarisxu 。
前段时间 , Russ Cox 明确了泛型相关的事情 , 原计划在标准库中加入泛型相关的包 , 改放到 golang.org/x/exp 下 。
目前 , Go 泛型的主要设计者 ianlancetaylor 完成了 slices 和 maps 包的开发 , 代码提交到了 golang.org/x/exp 中 , 如果经过使用、讨论等 , 社区认可后 , 预计在 1.19 中会合入标准库中 。
今天 , 通过学习 slices 包 , 掌握 Go 泛型的使用方法 。
01 为什么增加 slices 包标准库有 bytes 和 strings 包 , 分别用来处理 []byte 和 string 类型 , 提供了众多方便的函数 , 但对普通的 slice , 却没有相关的包可以使用 。
比如 bytes 和 strings 都有 Index 函数 , 用来在 []byte 或 string 查找某个 byte 或字符串的索引 。对于普通的 slice , 没法写一大堆包来处理 , 只能用户自己实现 , 这也是没有泛型的弊端 。
提供 bytes 和 strings , 主要是因为它们使用频率高现在有了泛型 , 可以实现一些便利的 slice 操作方法 , 必须要针对某一个具体类型的 slice 都实现一遍相同的功能 。
02 constraints 包继续讲解 slices 包之前 , 先看看 contraints 包 。
该包定义了一组用于类型参数(泛型)的有用约束 , 这个包已经确定在 Go 1.18 标准库中包含 , 截止目前(2021.11.27) , 该包定义了 6 个约束类型:
// Signed is a constraint that permits any signed integer type.// If future releases of Go add new predeclared signed integer types,// this constraint will be modified to include them.type Signed interface { ~int | ~int8 | ~int16 | ~int32 | ~int64}// Unsigned is a constraint that permits any unsigned integer type.// If future releases of Go add new predeclared unsigned integer types,// this constraint will be modified to include them.type Unsigned interface { ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr}// Integer is a constraint that permits any integer type.// If future releases of Go add new predeclared integer types,// this constraint will be modified to include them.type Integer interface { Signed | Unsigned}// Float is a constraint that permits any floating-point type.// If future releases of Go add new predeclared floating-point types,// this constraint will be modified to include them.type Float interface { ~float32 | ~float64}// Complex is a constraint that permits any complex numeric type.// If future releases of Go add new predeclared complex numeric types,// this constraint will be modified to include them.type Complex interface { ~complex64 | ~complex128}// Ordered is a constraint that permits any ordered type: any type// that supports the operators < <= >= >.// If future releases of Go add new ordered types,// this constraint will be modified to include them.type Ordered interface { Integer | Float | ~string}
前面 3 个是整型相关类型约束 , Float 是浮点型约束 , Complex 是负数类型约束 , 而 Ordered 表示支持排序的类型约束 , 表示支持大小比较的类型 。之前文章:《Go泛型系列:Go1.18 类型约束那些事》提到 , 约束语法变更了 , 一个是 | 符号 , 一个是 ~ , 上面定义中 , 很多地方都用到了 ~ 符号 , 它表示出了类型自身 , 底层类型是它的类型也适用该约束 。
03 slices 包详解目前 , slices 包有 14 个函数 , 可以分成几组:
- slice 比较
- 元素查找
- 修改 slice
- 克隆 slice
slice 比较比较两个 slice 中的元素 , 细分为是否相等和普通比较:
func Equal[E comparable](s1, s2 []E) boolfunc EqualFunc[E1, E2 any](s1 []E1, s2 []E2, eq func(E1, E2) bool) boolfunc Compare[E constraints.Ordered](s1, s2 []E) intfunc CompareFunc[E1, E2 any](s1 []E1, s2 []E2, cmp func(E1, E2) int) int
其中 comparable 约束是语言实现的(因为很常用) , 表示可比较约束(相等与否的比较) 。主要 , 其中的 E、E1、E2 等 , 只是泛型类型表示 , 你定义时 , 可以用你喜欢的 , 比如 T、T1、T2 等 。看一个具体的实现:
func Equal[E comparable](s1, s2 []E) bool { if len(s1) != len(s2) {return false } for i, v1 := range s1 {v2 := s2[i]if v1 != v2 {return false} } return true}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 上好茶品牌,缇丽莎尔护肤品全套系列用着怎么样
- 苹果|iPhone 14系列价格遭曝光:或全系上涨!约5280元起售
- 八马铁观音哪个系列好,铁观音和福鼎白茶哪个好选择哪个
- 密码应用系列之Kerberos身份认证协议
- 果茶系列取名,果茶的功效和作用
- 红木手镯系列市场分析
- 有哪些精致的洗笔系列
- 骁龙870|天玑8100+骁龙870双神U加持!疑似vivo S15系列入网:5月发布
- 圣恩熙女鞋产品系列简介
- D-Sub接口5大系列的深度解析