- 就地交换 * 是一种技术,用于交换两个不同变量的内容,而无需任何临时存储变量。
GoLang Spec提到:* 元组赋值将多值运算的各个元素赋值给变量列表。*
下面的代码在不使用临时变量的情况下执行交换操作(根据语法):
package main
import "fmt"
func main() {
a, b := 1, 2
swapActual(&a, &b)
fmt.Println(a, b)
a, b = 1, 2
swapCopy(a, b)
}
func swapActual(a, b *int) {
*a, *b = *b, *a
}
func swapCopy(a, b int) {
a, b = b, a
fmt.Println(a, b)
}
字符串
元组赋值语句*a, *b = *b, *a
的求值背后的机制是什么?这个求值是否隐式地涉及临时存储?
1条答案
按热度按时间0x6upsns1#
swap
函数中的*a, *b = *b, *a
行在不使用临时变量的情况下交换a
和b
的值。这个求值涉及到Go语言中指针的使用。当
swap
被调用时,它会收到a
和b
的内存地址(指针)。*a, *b = *b, *a
行取消引用这些指针,这意味着它会检索a
和b
指向的内存地址中存储的值。下面是一个逐步分解的步骤:
*a
检索存储在a
所指向的存储器地址处的值。*b
检索存储在b
所指向的存储器地址处的值。*a, *b = *b, *a
将*b
的值分配给*a
,并将*a
的值分配给*b
。这个求值不涉及用户代码上下文中的临时存储。它直接交换
a
和b
所指向的内存位置上的值,有效地交换了它们的内容。