如果我想交换go
中两个变量的值,我会这样做
func swap(xPtr, yPtr *int) {
dummy := *xPtr
*xPtr = *yPtr
*yPtr = *xPtr
}
但是,最干净的解决方案是*xPtr, *yPtr = *yPtr, *xPtr
。为什么这与计算有不同的作用
*xPtr = *yPtr
*yPtr = *xPtr
换句话说,从纯语法上来说,我知道如果*xPtr=1
,*yPtr=2
,
那么两者都必须修改为2
,而不是像2, 1
一样修改为*xPtr, *yPtr = *yPtr, *xPtr
。
答案 0 :(得分:4)
在Go中,要交换,只需写:
*xPtr, *yPtr = *yPtr, *xPtr
The Go Programming Language Specification
元组分配分配多值的各个元素 对变量列表进行操作。有两种形式。首先, 右手操作数是单个多值表达式,例如 函数调用,通道或映射操作或类型声明。的 左侧的操作数数目必须与 价值观。
在第二种形式中,左侧的操作数必须等于 右边的表达式数,每个表达式必须为 单值,并且右边的第n个表达式被分配给 左侧的第n个操作数:
one, two, three = '一', '二', '三'
任务分两个阶段进行。一,索引的操作数 表达式和指针间接指向(包括隐式指针) 左侧的选择器)和表达式 权利将按照通常的顺序进行评估。二,作业 按从左到右的顺序进行。
任务分两个阶段进行。一,指针的操作数 左侧的间接指令和右侧的表达式都是 按照通常的顺序进行评估。其次,进行分配 从左到右顺序。
例如,来回交换:
package main
import "fmt"
func main() {
xPtr, yPtr := new(int), new(int)
*xPtr, *yPtr = 1, 2
fmt.Println(*xPtr, *yPtr)
// Swap - idiomatic Go
*xPtr, *yPtr = *yPtr, *xPtr
fmt.Println(*xPtr, *yPtr)
// is equivalent to
// RHS - evaluate
ty := *yPtr
tx := *xPtr
// LHS - assign
*xPtr = ty
*yPtr = tx
fmt.Println(*xPtr, *yPtr)
// is equivalent to
// Optimized
t := *xPtr
*xPtr = *yPtr
*yPtr = t
fmt.Println(*xPtr, *yPtr)
// is not equivalent to
// Error: No swap
*xPtr = *yPtr
*yPtr = *xPtr
fmt.Println(*xPtr, *yPtr)
}
游乐场:https://play.golang.org/p/Ph4Dsc_jsJJ
输出:
1 2
2 1
1 2
2 1
1 1