在 Go 中交换变量值的最佳方式?
Best way to swap variable values in Go?
是否可以像 python 那样交换元素?
a,b = b,a
或者我们必须使用:
temp = a
a = b
b = temp
是的,这是可能的。假设 a
和 b
具有相同的类型,所提供的示例就可以正常工作。例如:
a, b := "second", "first"
fmt.Println(a, b) // Prints "second first"
b, a = a, b
fmt.Println(a, b) // Prints "first second"
这既合法又符合惯用语,因此无需使用中间缓冲区。
是的,可以使用多值赋值来交换元素:
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
有一个名为 Swapper 的函数,它接受一个切片和 returns 一个交换函数。此交换函数采用 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)
}
输出
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
是的,您可以使用
进行交换
a, b = b, a
因此,如果 a = 1 且 b= 2,
然后执行后
a , b = b, a
你得到 a = 2 和 b = 1
另外,如果你写
a, b, a = b, a, b
然后结果 b = 1 和 a = 2
您可以像这样使用 ^
选项...
func swap(nums []int, i, j int) {
nums[i] ^= nums[j]
nums[j] ^= nums[i]
nums[i] ^= nums[j]
}
是否可以像 python 那样交换元素?
a,b = b,a
或者我们必须使用:
temp = a
a = b
b = temp
是的,这是可能的。假设 a
和 b
具有相同的类型,所提供的示例就可以正常工作。例如:
a, b := "second", "first"
fmt.Println(a, b) // Prints "second first"
b, a = a, b
fmt.Println(a, b) // Prints "first second"
这既合法又符合惯用语,因此无需使用中间缓冲区。
是的,可以使用多值赋值来交换元素:
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
有一个名为 Swapper 的函数,它接受一个切片和 returns 一个交换函数。此交换函数采用 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)
}
输出
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
是的,您可以使用
进行交换a, b = b, a
因此,如果 a = 1 且 b= 2, 然后执行后
a , b = b, a
你得到 a = 2 和 b = 1
另外,如果你写
a, b, a = b, a, b
然后结果 b = 1 和 a = 2
您可以像这样使用 ^
选项...
func swap(nums []int, i, j int) {
nums[i] ^= nums[j]
nums[j] ^= nums[i]
nums[i] ^= nums[j]
}