3 回答
TA贡献1772条经验 获得超8个赞
并不是说你现在就可以在生产中使用泛型(截至 2020 年 10 月 2 日),但是对于对即将推出的 go 泛型功能感兴趣的人,使用最新的go设计草案,你可以编写一个泛型函数,reverse
如下所示
package main
import (
"fmt"
)
func reverse[T any](s []T) []T {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
return s
}
func main() {
s := []int{1, 2, 3, 4, 5}
s = reverse(s)
fmt.Println(s)
}
输出:
[5 4 3 2 1]
TA贡献1783条经验 获得超4个赞
在泛型出现(很可能被称为契约)之前,反射和接口是实现这种泛化的唯一工具。
您可以定义reverse()
取值interface{}
并使用reflect
包对其进行索引并交换元素。这通常很慢,并且难以阅读/维护。
接口提供了一种更好的方法,但要求您为不同类型编写方法。看一下这个sort
包,特别是sort.Sort()
函数:
func Sort(data Interface)
哪里sort.Interface
是:
type Interface interface {
// Len is the number of elements in the collection.
Len() int
// Less reports whether the element with
// index i should sort before the element with index j.
Less(i, j int) bool
// Swap swaps the elements with indexes i and j.
Swap(i, j int)
}
sort.Sort()能够对实现 的任何切片进行排序sort.Interface,任何具有排序算法完成其工作所需的方法的切片。这种方法的好处是,您也可以对其他数据结构进行排序,而不仅仅是切片(例如链接列表或数组),但通常使用切片。
TA贡献1831条经验 获得超4个赞
耐心!根据向该语言添加类型参数的最新提案草案,您将能够reverse在 Go 的未来版本中编写这样的通用函数:
func reverse[T any](s []T) []T {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
return s
}
func main() {
s := []int{1, 2, 3, 4, 5}
s = reverse(s)
fmt.Println(s)
}
(游乐场)
出于性能原因,您可能希望就地反转切片:
package main
import "fmt"
func reverse[T any](s []T) {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
}
func main() {
s := []int{1, 2, 3, 4, 5}
reverse(s)
fmt.Println(s)
}
(游乐场)
- 3 回答
- 0 关注
- 164 浏览
添加回答
举报