如何反转切片?

And*_*w C 6 go

如何[]interface{}在Go中反转任意切片()?我宁愿不必写作LessSwap使用sort.Reverse.是否有一种简单的内置方法可以做到这一点?

Cer*_*món 21

没有一个简单的内置用于反转接口{}的切片.您可以编写for循环来执行此操作:

for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
    s[i], s[j] = s[j], s[i]
}
Run Code Online (Sandbox Code Playgroud)

Go 1.8中引入的reflect.Swapper函数可用于编写通用的反转函数:

func reverseAny(s interface{}) {
    n := reflect.ValueOf(s).Len()
    swap := reflect.Swapper(s)
    for i, j := 0, n-1; i < j; i, j = i+1, j-1 {
        swap(i, j)
    }
}
Run Code Online (Sandbox Code Playgroud)

操场的例子

  • @Matze `~[]E` 用于自定义切片类型,例如 `type mySlice []int` (3认同)

ale*_*pin 10

这是反转通用切片的另一种可能方法(转到 1.18)

// You can edit this code!
// Click here and start typing.
package main

import (
    "fmt"
    "sort"
)

func main() {
    nums := []int64{10, 5, 15, 20, 1, 100, -1}
    ReverseSlice(nums)
    fmt.Println(nums)

    strs := []string{"hello", "world"}
    ReverseSlice(strs)
    fmt.Println(strs)

    runes := []rune{'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'}
    ReverseSlice(runes)
    for _, r := range runes {
        fmt.Print(string(r), " ")
    }
}

func ReverseSlice[T comparable](s []T) {
    sort.SliceStable(s, func(i, j int) bool {
        return i > j
    })
}
Run Code Online (Sandbox Code Playgroud)

运行上面的程序应该输出:

[-1 100 1 20 15 5 10]
[world hello]
d l r o w o l l e h 
Program exited.
Run Code Online (Sandbox Code Playgroud)

go playground


小智 8

这将返回一个反转的切片,而不修改原始切片。

官方维基页面使用的算法:https ://github.com/golang/go/wiki/SliceTricks#reversing

func reverse(s []interface{}) []interface{} {
    a := make([]interface{}, len(s))
    copy(a, s)

    for i := len(a)/2 - 1; i >= 0; i-- {
        opp := len(a) - 1 - i
        a[i], a[opp] = a[opp], a[i]
    }

    return a
}
Run Code Online (Sandbox Code Playgroud)