脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go 提案:增加泛型版 Slices 和 Maps 新包

Go 提案:增加泛型版 Slices 和 Maps 新包

2021-08-10 01:02脑子进煎鱼了陈煎鱼 Golang

今天要讨论的泛型版功能支持也是如此,分别包含:map(#47330)、slice(#45955)、container/set(#47331) 三种通用类型的支持。

 Go 提案:增加泛型版 Slices 和 Maps 新包

大家好,我是煎鱼。

现在是 2021 年 8 月份了,根据 Go 语言发布周期的 2,8 原则。Go 1.17 即将发布,在写这篇文章时,现在已经进行到了 rc2:

Go 提案:增加泛型版 Slices 和 Maps 新包

这意味着离 Go1.18 释出泛型的正式支持又近了一点点,社区中讨论泛型相关的周边功能的声音又多了起来。

今天要讨论的泛型版功能支持也是如此,分别包含:map(#47330)、slice(#45955)、container/set(#47331) 三种通用类型的支持。

我们主要展开 maps 和 slices,其余的都大同小异,理解核心思想就好。

maps

该提案建议定义一个新的包 maps,它将提供可用于任何类型的 map 的函数:

Go 提案:增加泛型版 Slices 和 Maps 新包

下面的描述侧重于描述 API 的提供:

  1. package maps 
  2.  
  3. func Keys[K comparable, V any](m map[K]V) []K 
  4.  
  5. func Values[K comparable, V any](m map[K]V) []V 
  6.  
  7. func Equal[K, V comparable](m1, m2 map[K]V) bool 
  8.  
  9. func EqualFunc[K comparable, V1, V2 any](m1 map[K]V1, m2 map[K]V2, cmp func(V1, V2) bool) bool 
  10.  
  11. func Clear[K comparable, V any](m map[K]V) 
  12.  
  13. func Clone[K comparable, V any](m map[K]V) map[K]V 
  14.  
  15. func Add[K comparable, V any](dst, src map[K]V) 
  16.  
  17. func Filter[K comparable, V any](m map[K]V, keep func(K, V) bool) 
  • Keys:返回 map 的键值。这些键将是一个不确定的顺序。
  • Values:返回 map 值。这些值将以不确定的顺序出现。
  • Equal:匹配两个 map 是否包含相同的键/值对。
  • EqualFunc:EqualFunc 与 Equal 类似,但使用 cmp 进行数值比较。
  • Clear:从 map 中清除所有条目,使其为空。
  • Clone:返回一个 map 的副本,这是一个浅层克隆。新的键和值使用普通的赋值来设置。
  • Add:将 src 中的所有键/值对添加到 dst 中。当 src 中的一个键已经存在于 dst 中时,dst 中的值将被 src 中的键相关的值覆盖。
  • Filter:过滤器从 map 中删除任何 keep 返回结果为 false 的键/值对。

slice

该提案建议定义一个新的包 slices,它将提供可用于任何类型的 slice 的函数:

Go 提案:增加泛型版 Slices 和 Maps 新包

下面的描述侧重于描述 API 的提供:

  1. package slices 
  2.  
  3. import "constraint" 
  4.  
  5. func Equal[T comparable](s1, s2 []T) bool 
  6.  
  7. func EqualFunc[T1, T2 any](s1 []T1, s2 []T2, eq func(T1, T2) bool) bool 
  8.  
  9. func Compare[T constraints.Ordered](s1, s2 []T) int 
  10.  
  11. func CompareFunc[T any](s1, s2 []T, cmp func(T, T) intint 
  12.  
  13. func Index[T comparable](s []T, v T) int 
  14.  
  15. func IndexFunc[T any](s []T, f func(T) bool) int 
  16.  
  17. func Contains[T comparable](s []T, v T) bool 
  18.  
  19. func Insert[S constraints.Slice[T], T any](s S, i int, v ...T) S 
  20.  
  21. func Delete[S constraints.Slice[T], T any](s S, i, j int) S 
  22.  
  23. func Clone[S constraints.Slice[T], T any](s S) S 
  • Equal:检查两个切片是否相等,以长度和元素值来比较。
  • EqualFunc:检查两个切片是否相等,以所传入的匹配函数来比较。
  • Compare/CompareFunc:
    • Compare 比较两个切片 s1 和 s2 的元素。
    • CompareFunc 与 Compare 类似,在每一对元素上使用所传入的比较函数。
  • Index:
    • Index 返回值 v 在切片 s 中第一次出现的索引,如果不存在,则返回-1。
    • IndexFunc 返回满足f(c)的第一个元素在s中的索引,如果没有则返回-1。
  • Contains:检查值 v 是否存在于切片 s 中。

插入、删除、克隆的 API 比较常见,这里我就不展开了。在通用类型的切片有一些比较特殊的 API:

  1. func Compact[S constraints.Slice[T], T comparable](s S) S 
  2.  
  3. func CompactFunc[S constraints.Slice[T], T any](s S, cmp func(T, T) bool) S 
  4.  
  5. func Grow[S constraints.Slice[T], T any](s S, n int) S 
  6.  
  7. func Clip[S constraints.Slice[T], T any](s S) S 
  • Compact/CompactFunc:
    • Compact 将连续运行的相等元素替换为单一的副本。这就像 Unix 中的 uniq 命令。会直接修改切片 s 的内容,不会重新创建一个。
    • CompactFunc 与 Compact 方法类似,但是使用一个比较函数来匹配。
  • Grow:如果有必要,Grow 会增长切片的容量,以保证另外 n 个元素的空间。在 Grow(n) 之后,至少有 n 个元素可以被添加到分片中而不需要再分配。如果 n 是负数或者太大,无法分配内存,Grow 将陷入恐慌。
  • Clip:从切片中移除未使用的容量,返回s[:len(s):len(s)]。

总结

如果这些提议被接受,这几个新包将被包含在实现泛型后的第一个Go版本中(我们目前预计将是Go 1.18)。

从issues 的讨论来看,通用类型的新包支持很大概率会实现,主要争议在实现细节,例如:性能、命名、规范等。

实现后值得期待,又是一次生产力的优化!

原文链接:https://mp.weixin.qq.com/s/D7u7nxixctoFIL-Pch0zvw

延伸 · 阅读

精彩推荐
  • GolangGO语言字符串处理Strings包的函数使用示例讲解

    GO语言字符串处理Strings包的函数使用示例讲解

    这篇文章主要为大家介绍了GO语言字符串处理Strings包的函数使用示例讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加...

    Jeff的技术栈6882022-04-14
  • GolangGo语言基础单元测试与性能测试示例详解

    Go语言基础单元测试与性能测试示例详解

    这篇文章主要为大家介绍了Go语言基础单元测试与性能测试示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步...

    枫少文7812021-12-05
  • GolangGolang 语言极简类型转换库cast的使用详解

    Golang 语言极简类型转换库cast的使用详解

    本文我们通过 cast.ToString() 函数的使用,简单介绍了cast 的使用方法,除此之外,它还支持很多其他类型,在这没有多多介绍,对Golang 类型转换库 cast相关知...

    Golang语言开发栈6112021-12-02
  • Golang深入浅析Go中三个点(...)用法

    深入浅析Go中三个点(...)用法

    这篇文章主要介绍了深入浅析Go中三个点(...)用法,需要的朋友可以参考下...

    踏雪无痕SS6472021-11-17
  • GolangGo语言实现自动填写古诗词实例代码

    Go语言实现自动填写古诗词实例代码

    这篇文章主要给大家介绍了关于Go语言实现自动填写古诗词的相关资料,这是最近在项目中遇到的一个需求,文中通过示例代码介绍的非常详细,需要的朋...

    FengY5862020-05-14
  • Golanggo语言获取系统盘符的方法

    go语言获取系统盘符的方法

    这篇文章主要介绍了go语言获取系统盘符的方法,涉及Go语言调用winapi获取系统硬件信息的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    无尽海3862020-04-24
  • GolangGo语言range关键字循环时的坑

    Go语言range关键字循环时的坑

    今天小编就为大家分享一篇关于Go语言range关键字循环时的坑,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来...

    benben_20154202020-05-23
  • GolangGolang实现四种负载均衡的算法(随机,轮询等)

    Golang实现四种负载均衡的算法(随机,轮询等)

    本文介绍了示例介绍了Golang 负载均衡的四种实现,主要包括了随机,轮询,加权轮询负载,一致性hash,感兴趣的小伙伴们可以参考一下...

    Gundy_8442021-08-09