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)
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)
小智 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)