在Go中交换变量值的最佳方法?

时间:2016-07-25 15:07:58

标签: go slice swap

是否可以像python一样交换元素?

a,b = b,a

或者我们必须使用:

temp = a
a = b
b = temp

4 个答案:

答案 0 :(得分:13)

是的,有可能。假设ab具有相同的类型,提供的示例将正常工作。例如:

a, b := "second", "first"
fmt.Println(a, b) // Prints "second first"
b, a = a, b
fmt.Println(a, b) // Prints "first second"

Run sample on the playground

这既合法也适用,因此无需使用中间缓冲区。

答案 1 :(得分:7)

是的,可以使用元组赋值交换元素:

i := []int{1, 2, 3, 4}
fmt.Println(i)

i[0], i[1] = i[1], i[0]
fmt.Println(i)

a, b := 1, 2
fmt.Println(a, b)

a, b = b, a // note the lack of ':' since no new variables are being created
fmt.Println(a, b)

输出:

[1 2 3 4]
[2 1 3 4]
1 2
2 1

示例:https://play.golang.org/p/sopFxCqwM1

此处有更多详情:https://golang.org/ref/spec#Assignments

答案 2 :(得分:2)

有一个名为Swapper的函数,该函数获取一个切片并返回交换函数。此交换函数需要2个索引,并交换切片中的索引值。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    s := []int{1, 2, 3}

    fmt.Printf("Before swap: %v\n", s)

    swapF := reflect.Swapper(s)

    swapF(0, 1)

    fmt.Printf("After swap: %v\n", s)
}

Try it

输出

Before swap: [1 2 3]
After swap: [2 1 3]

是的,您可以交换python之类的值。

a, b := 0, 1
fmt.Printf("Before swap a = %v, b = %v\n", a, b)

b, a = a, b
fmt.Printf("After swap a = %v, b = %v\n", a, b)

输出

Before swap a = 0, b = 1
After swap a = 1, b = 0

答案 3 :(得分:1)

是的,您可以使用交换

<块引用>

a, b = b, a

所以如果 a = 1 且 b = 2, 然后执行后

a , b = b, a

你得到 a = 2 和 b = 1

另外,如果你写

a, b, a = b, a, b

那么结果 b = 1 and a = 2