为了账号安全,请及时绑定邮箱和手机立即绑定

如何编写一个方法来反转任何切片?

如何编写一个方法来反转任何切片?

Go
侃侃尔雅 2023-06-26 16:52:12
编写对“通用”数组进行操作的方法的惯用方法是什么?我有一个类型数组: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 reversecannot use reverse(a) (type []interface {}) as type []int in assignment
查看完整描述

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]


查看完整回答
反对 回复 2023-06-26
?
慕娘9325324

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,任何具有排序算法完成其工作所需的方法的切片。这种方法的好处是,您也可以对其他数据结构进行排序,而不仅仅是切片(例如链接列表或数组),但通常使用切片。


查看完整回答
反对 回复 2023-06-26
?
慕容708150

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)

}

游乐场



查看完整回答
反对 回复 2023-06-26
  • 3 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信