如何在围棋中反转任意切片([]interface{})?我宁愿不用写LessSwap就可以使用sort.Reverse.有没有一种简单的、内置的方法来做这件事呢?

推荐答案

标准库没有用于反转切片的内置函数.使用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.18或更高版本中使用类型参数编写通用反转函数:

func reverse[S ~[]E, E any](s S)  {
    for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
        s[i], s[j] = s[j], s[i]
    }
}

使用reflect.Swapper在GO 1.8版或更高版本中编写处理任意切片类型的函数:

func reverse(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 the code on the Go playground美元.

此答案中的函数将切片反转到位.如果不想修改原始切片,请在反转切片之前执行copy the slice.

Go相关问答推荐

如何创建两个连接的io.ReadWriteClosers以用于测试目的

Go程序在并发Forking 循环中停留在syscall.Wait4

获取作为类型参数传递给方法接收方中的类型参数的切片的基础类型

如何将GoFr筛选器用于查询参数?

允许在 struct 中使用复合作为函数参数

错误&对象已被Golang在K8s操作符上修改

JWT 如何解析声明有效性和错误?

如何创建在responseWriter.Write 上返回错误的http.ResponseWriter 模拟实例?

是否需要手动调用rand.Seed?

下载和合并时输出文件已损坏

Yocto 无法交叉编译 GoLang Wails 应用程序

golang中如何声明多个接口约束?

golang yaml 马歇尔网址

有没有办法计算枚举中定义的项目总数?

是否可以从 golang 中的参数推断类型?

如何将整数哈希细分为范围

如何使用 math/big 对 bigInt 进行取模?

如何排除溢出矩阵的坐标

如何在 docker 文件中安装 golang 包?

Golang 查询扫描未将查询正确扫描到 struct 中