厦门网站设计公司找哪家厦门小程序建设,如何做好企业网站,电脑制作网站用哪个软件,wordpress段子主题max 函数
func max[T cmp.Ordered](x T, y …T) T 这是一个泛型函数#xff0c;用于从一组值中寻找并返回 最大值#xff0c;该函数至少要传递一个参数。在上述函数签名中#xff0c;T 表示类型参数#xff0c;它必须满足 cmp.Ordered 接口中定义的数据类型要求#xff0…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 mainimport fmtfunc main() {var a1, a2, a3 int64 1, 2, 3maxA : max(a1, a2, a3)fmt.Printf(%T, %d\n, maxA, maxA) // int64, 3var f1, f2, f3 float64 1.0, 2.0, 3.0maxF : max(f1, f2, f3)fmt.Printf(%T, %.1f\n, maxF, maxF) // float64, 3.0var s1, s2, s3 string aaa, aab, aacmaxS : max(s1, s2, s3)fmt.Printf(%T, %s\n, maxS, maxS) // string, aac
}
在上述示例中使用了 max 函数分别对 int64、float64 和 string 类型的一组值进行比较并获取最大值值得注意的地方是 string 类型的比较原理它是 基于字节的字典顺序对字符串进行比较。
min 函数
func min[T cmp.Ordered](x T, y …T) T
该函数与 max 函数的功能相反用于从一组值中寻找并返回 最小值同样传递进来的值类型也必须满足 cmp.Ordered 接口中定义的数据类型要求。
使用示例
package mainimport fmtfunc main() {var a1, a2, a3 int64 1, 2, 3minA : min(a1, a2, a3)fmt.Printf(%T, %d\n, minA, minA) // int64, 1var f1, f2, f3 float64 1.0, 2.0, 3.0minF : min(f1, f2, f3)fmt.Printf(%T, %.1f\n, minF, minF) // float64, 1.0var s1, s2, s3 string aaa, aab, aacminS : min(s1, s2, s3)fmt.Printf(%T, %s\n, minS, minS) // string, aaa
}
在上述示例中使用了 min 函数分别对 int64、float64 和 string 类型的一组值进行比较并获取最小值string 类型的比较原理与 max 函数的比较原理相同。
clear 函数
func clear[T ~[]Type | ~map[Type]Type1](t T) 该函数接收一个参数 t用于清空变量 t 类型为 slice 或 map 中的元素。
如果传递的是切片类型变量则会将切片的所有元素赋值为该切片类型的零值 如果传递的是 map 类型变量则会清空 map 类型变量的元素 如果传递的是自定义泛型类型例如 type MySlice[T any] []T则类型集中所有类型必须是 slice 或 map。
使用示例
package mainimport fmttype MySlice[T any] []T type MyMap[K comparable, V any] map[K]Vfunc 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 函数不仅能接收 slice 和 map 类型的变量还能接收我们所自定义的泛型类型参数但是在使用时必须确保类型参数集中所有类型必须是 slice 或 map。 值得注意的是使用 clear 函数清空切片元素时并不会真正的删除其中的元素而是会将所有元素都设置为对应类型的零值。这意味着切片仍然保留其原始长度和容量但元素的内容被清空。
小结
本文详细介绍了 Go 1.21.0 版本中新增的内置函数 max、min、和 clear。通过使用这些函数我们无需再自行定义比较大小或清空切片以及 map 变量的函数。 遗憾的是要彻底清空切片并将长度和容量都置为 0仍然需要另外封装一个函数来实现。因为 clear 函数只是将切片的元素赋值为相应类型的零值而未改变其长度和容量。