如何反转切片?

时间:2015-01-21 01:47:24

标签: go

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

3 个答案:

答案 0 :(得分:17)

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

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

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)
    }
}

playground example

答案 1 :(得分:0)

这将返回反转的切片,而无需修改原始切片。

官方Wiki页面上使用的算法: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
}

答案 2 :(得分:-1)

有我的代码示例,您可以在playground

中运行它
package main

import (
    "fmt"
    "reflect"
    "errors"
)

func ReverseSlice(data interface{}) {
    value := reflect.ValueOf(data)
    if value.Kind() != reflect.Slice {
        panic(errors.New("data must be a slice type"))
    }
    valueLen := value.Len()
    for i := 0; i <= int((valueLen-1)/2); i++ {
        reverseIndex := valueLen - 1 - i
        tmp := value.Index(reverseIndex).Interface()
        value.Index(reverseIndex).Set(value.Index(i))
        value.Index(i).Set(reflect.ValueOf(tmp))
    }
}


func main() {
    names := []string{"bob", "mary", "sally", "michael"}
    ReverseSlice(names)
    fmt.Println(names)
}