为什么 slices 包中的函数要为 slice 参数定义类型参数?

Bom*_*gar 3 generics go

为什么slices包中的BinarySearch函数是这样定义的:

func BinarySearch[S ~[]E, E cmp.Ordered](x S, target E) (int, bool)
Run Code Online (Sandbox Code Playgroud)

而不是这样的:

func BinarySearch[E cmp.Ordered](x []E, target E) (int, bool)
Run Code Online (Sandbox Code Playgroud)

我尝试编写适用于第一个定义的代码,但不能使用第二个定义进行编译。但我是新手,我不知道。

Bri*_*its 5

BinarySearch可以用任何一种方式写;事实上,定义曾经是:

func BinarySearch[E cmp.Ordered](x []E, target E) (int, bool)

改为:

func BinarySearchFunc[S ~[]E, E, T any](x S, target T, cmp func(E, T) int) (int, bool)

以下是本期的提案。提交解释了更改的原因:

切片:始终使用 S ~[]E

使所有函数都使用约束 S ~[]E,即使它们不返回切片类型。这使得显式实例化函数更加一致:您不必记住哪些采用 ~[]E 哪些不采用。它还允许在将这些函数之一传递给使用命名切片类型的其他函数时推断类型。