Go1.21新增maps包的用法详解

 更新时间:2023年08月27日 08:54:53   作者:路多辛  
maps 包提供了几个非常有用的用于操作 map 类型(任何类型的 map)的函数,本文为大家整理了部分函数的具体用法,感兴趣的小伙伴可以了解一下

maps.Clone

定义如下:

func Clone[M ~map[K]V, K comparable, V any](m M) M

返回 m 的一个副本,因为新的键和值是使用赋值方式复制的,所以这是一个浅克隆。简单示例如下:

package main
import (
    "fmt"
    "maps"
)
func main() {
    m := map[string]string{"foo": "bar"}
    m1 := maps.Clone(m)
    fmt.Println(m1) // map[foo:bar]
}

maps.Copy

定义如下:

func Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2)

复制 src 中的所有键值对并添加到 dst 中。当 src 中的键已经在 dst 中存在时,dst 中的值将被 src 中被该键对应的值覆盖。简单示例如下:

package main
import (
    "fmt"
    "maps"
)
func main() {
    m := map[string]string{"foo": "bar", "foo2": "bar2"}
    m1 := map[string]string{"foo": "bar2", "foo3": "bar3"}
    maps.Copy(m1, m)
    fmt.Println(m1) // map[foo:bar foo2:bar2 foo3:bar3]
}

maps.DeleteFunc

定义如下:

func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool)

从 m 中删除经 del 函数计算后返回 true 的所有键值对。简单示例如下:

package main
import (
    "fmt"
    "maps"
)
func main() {
    m := map[string]int{
        "one":   1,
        "two":   2,
        "three": 3,
        "four":  4,
    }
    maps.DeleteFunc(m, func(k string, v int) bool {
        return v%2 != 0 
    })
    fmt.Println(m)
}

删除所有值为奇数类型的键值对。

maps.Equal

定义如下:

func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool

判断两个 map 是否包含相同的键值对。简单示例如下:

package main
import (
    "fmt"
    "maps"
)
func main() {
    m := map[string]string{"foo": "bar", "foo2": "bar2"}
    m1 := map[string]string{"foo": "bar2", "foo3": "bar3"}
    m2 := map[string]string{"foo": "bar", "foo2": "bar2"}
    b := maps.Equal(m, m1)
    fmt.Println(b) // false
    b = maps.Equal(m, m2)
    fmt.Println(b) // true
}

maps.EqualFunc

定义如下:

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

类似于Equal函数,但使用自定义的 eq 函数进行比较。

package main
import (
    "fmt"
    "maps"
    "strings"
)
func main() {
    m1 := map[int]string{
        1:    "one",
        10:   "Ten",
        1000: "THOUSAND",
    }
    m2 := map[int][]byte{
        1:    []byte("One"),
        10:   []byte("Ten"),
        1000: []byte("Thousand"),
    }
    eq := maps.EqualFunc(m1, m2, func(v1 string, v2 []byte) bool {
        return strings.ToLower(v1) == strings.ToLower(string(v2))
    })
    fmt.Println(eq) // true
}

将值转换为小写的字符串后进行比较。

到此这篇关于Go1.21新增maps包的用法详解的文章就介绍到这了,更多相关Go1.21 maps包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言{}大括号的特殊用法实例探究

    Go语言{}大括号的特殊用法实例探究

    这篇文章主要为大家介绍了Go语言{}大括号的特殊用法实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 使用go语言实现查找两个数组的异同操作

    使用go语言实现查找两个数组的异同操作

    这篇文章主要介绍了使用go语言实现查找两个数组的异同操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 一文带你掌握Golang Interface原理和使用技巧

    一文带你掌握Golang Interface原理和使用技巧

    Golang 中的 interface 是一种非常重要的特性,可以让我们写出更加灵活的代码。在本篇文章中,我们将深入探讨 Golang 中interface 的原理和使用技巧,感兴趣的可以了解一下
    2023-04-04
  • Golang中深拷贝与浅拷贝详解

    Golang中深拷贝与浅拷贝详解

    这篇文章主要为大家详细介绍一下Golang深拷贝和浅拷贝,文中有详细的代码示例供大家参考,需要的可以参考一下
    2023-05-05
  • Go语言通过WaitGroup实现控制并发的示例详解

    Go语言通过WaitGroup实现控制并发的示例详解

    Channel能够很好的帮助我们控制并发,但是在开发习惯上与显示的表达不太相同,所以在Go语言中可以利用sync包中的WaitGroup实现并发控制,本文就来和大家详细聊聊WaitGroup如何实现控制并发
    2023-01-01
  • Go语言中比较两个map[string]interface{}是否相等

    Go语言中比较两个map[string]interface{}是否相等

    本文主要介绍了Go语言中比较两个map[string]interface{}是否相等,我们可以将其转化成顺序一样的 slice ,然后再转化未json,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • 详解Go语言如何使用标准库sort对切片进行排序

    详解Go语言如何使用标准库sort对切片进行排序

    Sort 标准库提供了对基本数据类型的切片和自定义类型的切片进行排序的函数。今天主要分享的内容是使用 Go 标准库 sort 对切片进行排序,感兴趣的可以了解一下
    2022-12-12
  • 在Golang中使用C语言代码实例

    在Golang中使用C语言代码实例

    这篇文章主要介绍了在Golang中使用C语言代码实例,本文先是给出了一个Hello World例子、Golang 引用 C例子,并总结了一些要注意的地方,需要的朋友可以参考下
    2014-10-10
  • 一文带你探索Go语言中的函数一等公民

    一文带你探索Go语言中的函数一等公民

    你是否听说过 Go 语言中的函数是一等公民,如果没有,那么恭喜你,本文将带你一起揭开这个神秘的面纱,感兴趣的小伙伴快来和小编一起学习起来吧
    2023-07-07
  • Go语言基于viper实现apollo多实例快速

    Go语言基于viper实现apollo多实例快速

    viper是适用于go应用程序的配置解决方案,这款配置管理神器,支持多种类型、开箱即用、极易上手。本文主要介绍了如何基于viper实现apollo多实例快速接入,感兴趣的可以了解一下
    2023-01-01

最新评论