学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《如何编写一个方法来反转任何切片?》,以下内容主要包含等知识点,如果你正在学习或准备学习golang,就都不要错过本文啦~让我们一起来看看
学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《如何编写一个方法来反转任何切片?》,以下内容主要包含等知识点,如果你正在学习或准备学习golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!
问题内容编写对“通用”数组进行操作的方法的惯用方法是什么?
我有一个类型化数组:
a := make([]int, 0)
我想编写一个可以对任何类型的数组进行操作的简单方法:
func reverse(a []interface{}) []interface{} {
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
a[i], a[j] = a[j], a[i]
}
return a
}
使用此方法 a = reverse(a)
给我两个错误:
cannot use a (type []int) as type []interface {} in argument to reverse
cannot use reverse(a) (type []interface {}) as type []int in assignment
在泛型到来之前(很可能被称为 contracts),反射和接口是实现这种泛化的唯一工具。
您可以定义 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
的任何切片进行排序,任何具有排序算法完成其工作所需的方法的切片。这种方法的好处是,您不仅可以对切片(例如链表或数组)对其他数据结构进行排序,但通常会使用切片。
并不是说您可以在生产中使用泛型作为现在(截至 2020 年 10 月 2 日),但对于对即将推出的 Go 泛型功能感兴趣的人,使用最新的 design draft go,您可以编写一个泛型函数 rverse
,如下所示
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]
理论要掌握,实操不能落!以上关于《如何编写一个方法来反转任何切片?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注编程网公众号吧!
--结束END--
本文标题: 如何编写一个方法来反转任何切片?
本文链接: https://lsjlt.com/news/596364.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0