Go 1.21 新内置函数:min、max 和 clear

简介: Go 1.21 版本已经正式发布,它带来了许多新特性和改进。其中引入了的三个新内置函数:max、min 和 clear,接下来的内容将详细介绍这些函数的用途和特点。

前言

Go 1.21 版本已经正式发布,它带来了许多新特性和改进。其中引入了的三个新内置函数:maxminclear,接下来的内容将详细介绍这些函数的用途和特点。

准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。

max 函数

func max[T cmp.Ordered](x T, y ...T) T

这是一个泛型函数,用于从一组值中寻找并返回 最大值,该函数至少要传递一个参数。在上述函数签名中,T 表示类型参数,它必须满足 cmp.Ordered 接口中定义的数据类型要求,该接口的定义如下所示:

type Ordered interface {
   
    ~int | ~int8 | ~int16 | ~int32 | ~int64 |
        ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
        ~float32 | ~float64 |
        ~string
}

使用示例

了解了 max 函数的定义后,让我们一起来学习如何使用它。

package main

import "fmt"

func main() {
   
    var a1, a2, a3 int64 = 1, 2, 3
    maxA := max(a1, a2, a3)
    fmt.Printf("%T, %d\n", maxA, maxA) // int64, 3

    var f1, f2, f3 float64 = 1.0, 2.0, 3.0
    maxF := max(f1, f2, f3)
    fmt.Printf("%T, %.1f\n", maxF, maxF) // float64, 3.0

    var s1, s2, s3 string = "aaa", "aab", "aac"
    maxS := max(s1, s2, s3)
    fmt.Printf("%T, %s\n", maxS, maxS) // string, aac
}

在上述示例中,使用了 max 函数分别对 int64float64string 类型的一组值进行比较并获取最大值,值得注意的地方是 string 类型的比较原理,它是 基于字节的字典顺序对字符串进行比较

min 函数

func min[T cmp.Ordered](x T, y ...T) T

该函数与 max 函数的功能相反,用于从一组值中寻找并返回 最小值,同样传递进来的值类型也必须满足 cmp.Ordered 接口中定义的数据类型要求。

使用示例

package main

import "fmt"

func main() {
   
    var a1, a2, a3 int64 = 1, 2, 3
    minA := min(a1, a2, a3)
    fmt.Printf("%T, %d\n", minA, minA) // int64, 1

    var f1, f2, f3 float64 = 1.0, 2.0, 3.0
    minF := min(f1, f2, f3)
    fmt.Printf("%T, %.1f\n", minF, minF) // float64, 1.0

    var s1, s2, s3 string = "aaa", "aab", "aac"
    minS := min(s1, s2, s3)
    fmt.Printf("%T, %s\n", minS, minS) // string, aaa
}

在上述示例中,使用了 min 函数分别对 int64float64string 类型的一组值进行比较并获取最小值,string 类型的比较原理与 max 函数的比较原理相同。

clear 函数

func clear[T ~[]Type | ~map[Type]Type1](t T)

该函数接收一个参数 t,用于清空变量 t (类型为 slicemap) 中的元素。

  • 如果传递的是切片类型变量,则会将切片的所有元素赋值为该切片类型的零值
  • 如果传递的是 map 类型变量,则会清空 map 类型变量的元素;
  • 如果传递的是自定义泛型类型(例如 type MySlice[T any] []T),则类型集中所有类型必须是 slicemap

使用示例

package main

import "fmt"

type MySlice[T any] []T  

type MyMap[K comparable, V any] map[K]V

func main() {
   
    s := []int{
   1, 2, 3, 4}
    clear(s)
    fmt.Printf("len: %d, cap: %d, elems: %v\n", len(s), cap(s), s) // len: 4, cap: 4, elems: [0 0 0 0]

    m := map[string]int{
   "Apple": 1, "Banana": 2}
    clear(m)
    fmt.Printf("len: %d, elems: %v\n", len(m), m) // len: 0, elems: map[]

    // 自定义泛型切片类型变量
    mySlice := MySlice[string]{
   "公众号:Go技术干货", "陈明勇", "Gopher"}
    clear(mySlice)
    fmt.Printf("len: %d, cap: %d, elems: %v\n", len(mySlice), cap(mySlice), mySlice) // len: 3, cap: 3, elems: [  ]

    // 自定义泛型 map 类型变量
    myMap := MyMap[string, int]{
   "Apple": 1, "Banana": 2}
    clear(myMap)
    fmt.Printf("len: %d, elems: %v\n", len(myMap), myMap) // len: 0, elems: map[]
}

在上述示例中,演示了如何通过 clear 函数对切片或 map 变量进行删除或清空操作,clear 函数不仅能接收 slicemap 类型的变量,还能接收我们所自定义的泛型类型参数,但是在使用时必须确保类型参数集中所有类型必须是 slicemap

值得注意的是:使用 clear 函数清空切片元素时,并不会真正的删除其中的元素,而是会将所有元素都设置为对应类型的零值。这意味着切片仍然保留其原始长度和容量,但元素的内容被清空。

小结

本文详细介绍了 Go 1.21.0 版本中新增的内置函数 maxmin、和 clear。通过使用这些函数,我们无需再自行定义比较大小或清空切片以及 map 变量的函数。

遗憾的是,要彻底清空切片并将长度和容量都置为 0,仍然需要另外封装一个函数来实现。因为 clear 函数只是将切片的元素赋值为相应类型的零值,而未改变其长度和容量。

作者:陈明勇

个人网站:chenmingyong.cn

文章持续更新,如果本文能让您有所收获,欢迎点赞收藏加关注本号。

微信阅读可搜《Go技术干货》。这篇文章已被收录于 GitHub https://github.com/chenmingyong0423/blog ,欢迎大家 Star 催更并持续关注。

目录
相关文章
|
1天前
|
Go 数据处理
Go杂记1-切片Slice作为函数参数那点事儿
Go杂记1-切片Slice作为函数参数那点事儿
7 0
|
1天前
|
存储 Go 开发者
【Go语言专栏】函数在Go语言中的使用与实现
【4月更文挑战第30天】本文介绍了Go语言中函数的使用和实现,包括函数定义、参数传递、返回值、匿名函数、变长参数、函数类型、闭包和错误处理。通过示例展示了如何定义和调用函数,以及如何利用闭包和递归解决问题。此外,还提到了Go函数作为一等公民的特性,允许存储和传递。进一步学习可参考官方文档和相关书籍。
|
1天前
|
Go
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
【4月更文挑战第21天】Go语言函数是代码组织的基本单元,用于封装可重用逻辑。本文介绍了函数定义(包括基本形式、命名、参数列表和多返回值)、调用以及匿名函数与闭包。在函数定义时,注意参数命名和注释,避免参数顺序混淆。在调用时,要检查并处理多返回值中的错误。理解闭包原理,小心处理外部变量引用,以提升代码质量和可维护性。通过实践和示例,能更好地掌握Go语言函数。
30 1
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
|
1天前
|
程序员 Go API
【Go语言快速上手(二)】 分支与循环&函数讲解
【Go语言快速上手(二)】 分支与循环&函数讲解
|
1天前
|
存储 Go 开发者
Golang深入浅出之-Go语言字符串操作:常见函数与面试示例
【4月更文挑战第20天】Go语言字符串是不可变的字节序列,采用UTF-8编码。本文介绍了字符串基础,如拼接(`+`或`fmt.Sprintf()`)、长度与索引、切片、查找与替换(`strings`包)以及转换与修剪。常见问题包括字符串不可变性、UTF-8编码处理、切片与容量以及查找与替换的边界条件。通过理解和实践这些函数及注意事项,能提升Go语言编程能力。
28 0
|
1天前
|
自然语言处理 数据挖掘 程序员
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)(下)
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)(上)
27 1
|
1天前
|
数据采集 搜索推荐 Go
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)(上)
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)
26 1
|
1天前
|
供应链 算法 安全
掌握Go语言:函数精髓,定义、参数、多返回值与应用(14)
掌握Go语言:函数精髓,定义、参数、多返回值与应用(14)
|
1天前
|
消息中间件 编译器 数据库连接
|
1天前
|
Go 开发者
Go语言函数的高级特性探索
【2月更文挑战第4天】本文旨在深入解析Go语言中函数的高级特性,包括可变参数函数、函数作为值传递、函数作为参数传递、函数作为返回值、函数指针以及泛型函数等。通过掌握这些高级特性,你将能够编写更加灵活和强大的Go语言程序。

热门文章

最新文章