Go 泛型:Maps 包正式释出,现在可用!
2023-04-18 15:43:16 时间
本文转载自微信公众号「脑子进煎鱼了」,作者 陈煎鱼 。转载本文请联系脑子进煎鱼了公众号。
大家好,我是煎鱼。
给大家带来一个关于泛型的新消息,那就是:在几天前,Go 泛型的配套标准库 golang.org/x/exp/maps 包已经正式提交,放出来了,可以使用。
如下图:
cs.opensource.google
包代码如下:
- package maps
- func Keys[M ~map[K]V, K comparable, V any](m M) []K {
- r := make([]K, 0, len(m))
- for k := range m {
- r = append(r, k)
- }
- return r
- }
- func Values[M ~map[K]V, K comparable, V any](m M) []V {
- r := make([]V, 0, len(m))
- for _, v := range m {
- r = append(r, v)
- }
- return r
- }
- func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool {
- if len(m1) != len(m2) {
- return false
- }
- for k, v1 := range m1 {
- if v2, ok := m2[k]; !ok || v1 != v2 {
- return false
- }
- }
- return true
- }
- func EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M2, eq func(V1, V2) bool) bool {
- if len(m1) != len(m2) {
- return false
- }
- for k, v1 := range m1 {
- if v2, ok := m2[k]; !ok || !eq(v1, v2) {
- return false
- }
- }
- return true
- }
- func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool) {
- for k, v := range m {
- if del(k, v) {
- delete(m, k)
- }
- }
- }
- Keys:返回 map 的键值内容,键值将以不确定的顺序出现。
- Values:返回 map 的值,值将以不确定的顺序出现。
- Equal:检查两个地图是否包含相同的键/值对,内部会使用 == 来比较数值。
- EqualFunc:EqualFunc与 Equal 方法类似,但使用闭包方法来比较数值,键值仍然用 == 来比较。
- DeleteFunc:删除 map 中闭包方法返回 true 的任何键/值对。
- func Clear[M ~map[K]V, K comparable, V any](m M) {
- for k := range m {
- delete(m, k)
- }
- }
- func Clone[M ~map[K]V, K comparable, V any](m M) M {
- r := make(M, len(m))
- for k, v := range m {
- r[k] = v
- }
- return r
- }
- func Copy[M ~map[K]V, K comparable, V any](dst, src M) {
- for k, v := range src {
- dst[k] = v
- }
- }
Clear:清除从 map 中删除所有条目,使之为空。
Clone:返回一个 map 的副本,这是一个浅层克隆,新拷贝出来的的键和值使用普通的赋值来设置。
Copy:复制 src 中的所有键/值对,并将其加入 dst。当 src 中的一个键已经存在于 dst 中时,dst 中的值将被与 src 中的键相关的值所覆盖。
本次 Go 泛型库 maps 的更新,主要包含了泛型最新的特性的迭代,也就是 “近似元素”,源码地址:https://cs.opensource.google/go/x/exp/+/master:maps/maps.go。
相关文章
- Installation RabbitMQ-3.10.2 on CentOS 7.9
- Linux文件描述符
- Linux 挂载Windows共享文件夹和NAS存储
- 记在Linux系统实现用nginx解析php
- 记在Linux系统源码包安装MySQL
- clang在编译时指定目标文件所需的最低macOS版本
- ARM TrustZone白皮书部分阅读
- 逻辑分析仪使用介绍
- gimp脚本.scm一些心得记录
- 虚拟机和Ubuntu的安装
- 记linux系统(centos7)的IP地址永久性配置
- PHY驱动调试之 --- MDIO/MDC接口22号和45号条款(一)
- 内核常用的might_sleep函数
- Armv8之Execution State 和 Exception Level(一)
- AArch32/AArch64系统级内存模型(三)
- AArch32/AArch64应用程序级内存模型(五)
- 如何找到端口的进程号
- Linux 系统 logroate日志管理
- Linux进程调度算法
- Linux文件权限操作