Go?1.21新內(nèi)置函數(shù)min、max和clear的用法詳解
前言
Go 1.21 版本已經(jīng)正式發(fā)布,它帶來了許多新特性和改進(jìn)。其中引入了的三個新內(nèi)置函數(shù):max、min 和 clear,接下來的內(nèi)容將詳細(xì)介紹這些函數(shù)的用途和特點(diǎn)。
準(zhǔn)備好了嗎?準(zhǔn)備一杯你最喜歡的咖啡或茶,隨著本文一探究竟吧。
max 函數(shù)
func max[T cmp.Ordered](x T, y ...T) T
這是一個泛型函數(shù),用于從一組值中尋找并返回 最大值,該函數(shù)至少要傳遞一個參數(shù)。在上述函數(shù)簽名中,T 表示類型參數(shù),它必須滿足 cmp.Ordered 接口中定義的數(shù)據(jù)類型要求,該接口的定義如下所示:
type Ordered interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 |
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
~float32 | ~float64 |
~string
}使用示例
了解了 max 函數(shù)的定義后,讓我們一起來學(xué)習(xí)如何使用它。
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 函數(shù)分別對 int64、float64 和 string 類型的一組值進(jìn)行比較并獲取最大值,值得注意的地方是 string 類型的比較原理,它是 基于字節(jié)的字典順序?qū)ψ址M(jìn)行比較。
min 函數(shù)
func min[T cmp.Ordered](x T, y ...T) T
該函數(shù)與 max 函數(shù)的功能相反,用于從一組值中尋找并返回 最小值,同樣傳遞進(jìn)來的值類型也必須滿足 cmp.Ordered 接口中定義的數(shù)據(jù)類型要求。
使用示例
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
// 按照字節(jié)逐個比較字符串的內(nèi)容
var s1, s2, s3 string = "aaa", "aab", "aac"
maxS := min(s1, s2, s3)
fmt.Printf("%T, %s\n", maxS, maxS) // string, aaa
}在上述示例中,使用了 min 函數(shù)分別對 int64、float64 和 string 類型的一組值進(jìn)行比較并獲取最小值,string 類型的比較原理與 max 函數(shù)的比較原理相同。
clear 函數(shù)
func clear[T ~[]Type | ~map[Type]Type1](t T)
該函數(shù)接收一個參數(shù) t,用于清空變量 t (類型為 slice 或 map) 中的元素。
- 如果傳遞的是切片類型變量,則會將切片的所有元素賦值為該切片類型的零值;
- 如果傳遞的是
map類型變量,則會清空map類型變量的元素; - 如果傳遞的是自定義泛型類型(例如
type MySlice[T any] []T),則類型集中所有類型必須是slice或map。
使用示例
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技術(shù)干貨", "陳明勇", "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 函數(shù)對切片或 map 變量進(jìn)行刪除或清空操作,clear 函數(shù)不僅能接收 slice 和 map 類型的變量,還能接收我們所自定義的泛型類型參數(shù),但是在使用時必須確保類型參數(shù)集中所有類型必須是 slice 或 map。
值得注意的是:使用 clear 函數(shù)清空切片元素時,并不會真正的刪除其中的元素,而是會將所有元素都設(shè)置為對應(yīng)類型的零值。這意味著切片仍然保留其原始長度和容量,但元素的內(nèi)容被清空。
小結(jié)
本文詳細(xì)介紹了 Go 1.21.0 版本中新增的內(nèi)置函數(shù) max、min、和 clear。通過使用這些函數(shù),我們無需再自行定義比較大小或清空切片以及 map 變量的函數(shù)。
遺憾的是,要徹底清空切片并將長度和容量都置為 0,仍然需要另外封裝一個函數(shù)來實(shí)現(xiàn)。因?yàn)?clear 函數(shù)只是將切片的元素賦值為相應(yīng)類型的零值,而未改變其長度和容量。
到此這篇關(guān)于Go 1.21新內(nèi)置函數(shù)min、max和clear的用法詳解的文章就介紹到這了,更多相關(guān)Go內(nèi)置函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言使用make進(jìn)行內(nèi)存分配的代碼示例
在Go語言里,內(nèi)存分配是程序開發(fā)中的關(guān)鍵環(huán)節(jié),make是Go語言內(nèi)置的一個重要函數(shù),專門用于為切片(slice)、映射(map)和通道(channel)這三種引用類型分配內(nèi)存并初始化,本文將深入剖析 make 函數(shù)的使用,結(jié)合代碼示例與實(shí)際項(xiàng)目場景,幫助開發(fā)者更好地掌握這一特性2025-06-06
Go多文件調(diào)用與main函數(shù)踩坑及解決
本文介紹了在學(xué)習(xí)Go語言時常見的幾個錯誤及其解決方法,包括多文件、main函數(shù)、包作用域以及gorun的使用方式,通過詳細(xì)的分析和示例,幫助讀者更好地理解和解決這些問題2026-02-02

