如何在 Golang 中按索引交换值

how to swap values by index in Golang

在 python 的 numpy 中,可以很容易地按列表中的索引交换值,如下所示:

a[[2, 3, 5]] = a[[5, 2, 3]]

有没有好的方法在Golang中实现这个功能

Go 没有那种花哨的索引;最接近的是

a[2],a[3],a[5] = a[5],a[2],a[3]

使用常规索引和常规 tuple assignment.

Is there a good way to implement this function in Go[...][? emph mine]

没有。 Go 没有为此提供语法。 请注意,inplace 排列是一个难题(并且可能 numpy 也不会在后台执行此操作)。

复制并排列。

如果你想要类似的东西,你可以过度设计一些解决方案,但会产生很多问题和处理

为了让您了解我的意思,请看这个 Go PlayGround Go 将 Slices 作为参考传递,因此制作一个函数来交换位置,你会得到这样的东西

package main

import (
    "errors"
    "fmt"
    "strings"
    "strconv"
)

func main() {
    a := []int{1, 2, 3, 4, 5, 6}
    err := swap(a, "1,3,5=>0,2,4")
    fmt.Println(a, err)
}

func swap(arr []int, str string) error {
    parts := strings.Split(str, "=>")
    if len(parts) != 2 {
        return errors.New("Invalid Input")
    }

    leftIndices := strings.Split(parts[0], ",")
    rightIndices := strings.Split(parts[1], ",")

    if len(leftIndices) != len(rightIndices) {
        return errors.New("Swap Indices not Balanced")
    }
    
    fmt.Println(leftIndices, rightIndices)

    for i := 0; i < len(leftIndices); i++ {
        i1, _:= strconv.Atoi(leftIndices[i])
        i2, _:= strconv.Atoi(rightIndices[i])

        arr[i1], arr[i2] = arr[i2], arr[i1]
        fmt.Println(arr)
    }
    return nil
}

即便如此,我也需要处理很多情况(虽然仍有一些未处理),使某些东西通用将需要更多的检查和复杂性

使用像

这样的内置语法会更容易
a[0], a[1], a[2] = a[3], a[4], a[5]