分享

Go 1.21中引入的新包:maps 和 cmp

 技术的游戏 2023-09-18 发布于广东

随着Go 1.21的发布,将有两个令人兴奋的包被引入到核心库中,这两个包专注于操作maps和提供比较功能。让我们仔细看看这些包:

1. maps 包

maps包为处理maps提供实用工具,使克隆、复制、删除和比较map条目变得更加简单和高效。

函数

  • · Clone: 克隆一个map。

 m := map[string]int{"one"1"two"2}
 cloned := maps.Clone(m)
 fmt.Println(cloned) // Output: map[one:1 two:2]
  • · Copy: 将键/值对从一个map复制到另一个map。

 dst := map[string]int{"one"1}
 src := map[string]int{"two"2}
 maps.Copy(dst, src)
 // dst is now {"one": 1, "two": 2}
 fmt.Printf("%#v\n", dst)
  • · DeleteFunc: 根据给定的函数从map中删除键/值对。

 m := map[string]int{"one"1"two"2}
 maps.DeleteFunc(m, func(k string, v intbool { return v == 2 })
 fmt.Println(m) // Output: map[one:1]
  • · Equal 和 EqualFunc: 比较两个map以检查它们是否相等。

 m1 := map[string]int{"one"1"two"2}
 m2 := map[string]int{"one"1"two"2}
 equal := maps.Equal(m1, m2) // true
 fmt.Println(equal)

2. cmp 包

cmp 包定义了用于比较有序类型的函数和类型,包括整数、浮点数和字符串。该包提供了一种一致的方式来比较值,包括浮点类型的 NaN 值。

函数

  • · Compare: 比较两个有序值并返回 -1、0 或 +1。

 result := cmp.Compare(510// -1
 fmt.Println(result)
 result = cmp.Compare(105// 1
 fmt.Println(result)
 result = cmp.Compare(55// 0
 fmt.Println(result)
  • · Less: 判断一个值是否小于另一个值。

 isLess := cmp.Less(510// true
 fmt.Println(isLess)
 isLess = cmp.Less(105// false
 fmt.Println(isLess)
 isLess = cmp.Less(1010// false
 fmt.Println(isLess)

类型

  • · Ordered: 一个约束,允许任何有序类型,包括支持比较运算符如<<=>=>的类型。这个约束可以与类型参数一起使用,确保与通用函数或类型一起使用的类型满足所需的约束。

func Min[T cmp.Ordered](a, b T) T {
 if cmp.Less(a, b) {
  return a
 }
 return b
}

func main() {
 minInt := Min(35)        // minInt is 3
 minString := Min("a""b"// minString is "a"

 fmt.Println(minInt, minString)
}

结论

在 Go 中引入 maps 和 cmp 包代表了增强该语言核心功能的重要一步。有了这些添加,开发者现在可以轻松地操作和比较映射和有序类型,进一步简化他们的代码。通过将常见操作抽象到这些核心包中,Go 继续追求开发体验中的效率、清晰性和稳健性。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多