Std Slice
文档中的函数签名如何理解
func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S
这个函数签名使用了 Go 1.18 引入的泛型特性。让我们逐步解析这个签名:
1. 泛型类型参数
[S ~[]E, E any]
S和E是类型参数。S ~[]E表示S是一个切片类型,其元素类型是E。~操作符表示S可以是任何与[]E类型一致的类型(即切片类型)。E any表示E可以是任何类型。
2. 函数参数
(s S, eq func(E, E) bool)
s是类型为S的参数,即一个切片。eq是一个函数类型参数,接受两个E类型的参数,并返回一个布尔值。这个函数用于比较两个元素是否相等。
3. 返回值
S
- 函数返回一个类型为
S的值,即一 个与输入切片类型相同的切片。
完整签名解释
func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S
CompactFunc是一个泛型函数,它接受一个切片s和一个比较函数eq,并返回一个新的切片。- 其中,
S是一个切片类型,E是切片的元素类型。 eq函数用于比较切片中的元素是否相等。
示例代码
以下是一个使用 CompactFunc 的示例,它移除切片中的相邻重复元素:
package main
import (
"fmt"
"golang.org/x/exp/slices"
)
func main() {
slice := []string{"apple", "apple", "banana", "banana", "cherry"}
compacted := slices.CompactFunc(slice, func(a, b string) bool {
return a == b
})
fmt.Println("Compacted:", compacted) // 输出: Compacted: [apple banana cherry]
}
在这个示例中:
slice是一个[]string类型的切片。CompactFunc函数接受这个切片和一个比较函数func(a, b string) bool { return a == b }。CompactFunc返回一个新的切片,其中相邻的重复元素被移除。