关于交换和元组分配的基本查询

时间:2018-07-05 00:34:40

标签: pointers go

如果我想交换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

1 个答案:

答案 0 :(得分:4)

在Go中,要交换,只需写:

*xPtr, *yPtr = *yPtr, *xPtr

  

The Go Programming Language Specification

     

Assignments

     

元组分配分配多值的各个元素   对变量列表进行操作。有两种形式。首先,   右手操作数是单个多值表达式,例如   函数调用,通道或映射操作或类型声明。的   左侧的操作数数目必须与   价值观。

     

在第二种形式中,左侧的操作数必须等于   右边的表达式数,每个表达式必须为   单值,并且右边的第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