Go 1.21新内置函数min、max和clear的用法详解

 更新时间:2023年08月09日 10:20:14   作者:陈明勇  
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.Println(maxS) // 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
	maxA := min(a1, a2, a3)
	fmt.Printf("%T, %d\n", maxA, maxA) // int64, 1
	var f1, f2, f3 float64 = 1.0, 2.0, 3.0
	maxF := min(f1, f2, f3)
	fmt.Printf("%T, %.1f\n", maxF, maxF) // float64, 1.0
	// 按照字节逐个比较字符串的内容
	var s1, s2, s3 string = "aaa", "aab", "aac"
	maxS := min(s1, s2, s3)
	fmt.Printf("%T, %s\n", maxS, maxS) // 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 函数只是将切片的元素赋值为相应类型的零值,而未改变其长度和容量。

到此这篇关于Go 1.21新内置函数min、max和clear的用法详解的文章就介绍到这了,更多相关Go内置函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang 空结构体特性与用法详解

    Golang 空结构体特性与用法详解

    本文主要介绍了Golang 空结构体特性与用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • golang高并发之本地缓存详解

    golang高并发之本地缓存详解

    这篇文章主要为大家详细介绍了golang高并发中本地缓存的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • golang关闭chan通道的方法示例

    golang关闭chan通道的方法示例

    在go语言中,通道(channel)是一个非常重要的概念,通道提供了一种在不同 goroutine 之间安全地传递数据的方式,在本文中,我们将讨论如何关闭通道以及在关闭通道时需要考虑的事项,需要的朋友可以参考下
    2024-02-02
  • Go语言使用make进行内存分配的代码示例

    Go语言使用make进行内存分配的代码示例

    在Go语言里,内存分配是程序开发中的关键环节,make是Go语言内置的一个重要函数,专门用于为切片(slice)、映射(map)和通道(channel)这三种引用类型分配内存并初始化,本文将深入剖析 make 函数的使用,结合代码示例与实际项目场景,帮助开发者更好地掌握这一特性
    2025-06-06
  • Go多文件调用与main函数踩坑及解决

    Go多文件调用与main函数踩坑及解决

    本文介绍了在学习Go语言时常见的几个错误及其解决方法,包括多文件、main函数、包作用域以及gorun的使用方式,通过详细的分析和示例,帮助读者更好地理解和解决这些问题
    2026-02-02
  • 在Golang中使用iota案例详解

    在Golang中使用iota案例详解

    在Go语言中,iota是一个预定义的标识符,用于在常量声明中生成连续的递增值,iota的值从0开始,每次在常量声明中使用时递增,本就给大家讲解一下Golang中iota的使用案例,感兴趣的同学跟着小编一起来看看吧
    2023-07-07
  • 使用Go语言解析动态JSON格式的方法

    使用Go语言解析动态JSON格式的方法

    本篇文章主要介绍了使用Go语言解析动态JSON格式的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • go defer延迟调用的使用场景示例详解

    go defer延迟调用的使用场景示例详解

    这篇文章主要为大家介绍了go defer延迟调用的使用场景示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Go语言异常处理案例解析

    Go语言异常处理案例解析

    这篇文章主要介绍了Go语言异常处理案例解析,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Go语言学习otns示例分析

    Go语言学习otns示例分析

    这篇文章主要为大家介绍了Go语言学习otns示例分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论