В Go, чтобы поменяться местами просто напишите:
*xPtr, *yPtr = *yPtr, *xPtr
Спецификация языка программирования Go
Назначение
Назначение кортежа присваивает отдельные элементы многозначного
операция со списком переменных. Есть две формы. Во-первых,
правый операнд - это однозначное выражение, такое как
вызов функции, операция канала или карты, или утверждение типа.
количество операндов на левой стороне должно соответствовать количеству
ценности.
Во втором виде число операндов слева должно равняться
количество выражений справа, каждое из которых должно быть
однозначное, а 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