【问题标题】:Best way to swap variable values in Go?在 Go 中交换变量值的最佳方法?
【发布时间】:2016-11-29 00:11:53
【问题描述】:

是否可以像在 python 中那样交换元素?

a,b = b,a

或者我们必须使用:

temp = a
a = b
b = temp

【问题讨论】:

    标签: go slice swap


    【解决方案1】:

    是的,这是可能的。假设ab 具有相同的类型,则提供的示例可以正常工作。例如:

    a, b := "second", "first"
    fmt.Println(a, b) // Prints "second first"
    b, a = a, b
    fmt.Println(a, b) // Prints "first second"
    

    Run sample on the playground

    这既合法又惯用,因此无需使用中间缓冲区。

    【讨论】:

      【解决方案2】:

      是的,可以使用多值赋值来交换元素:

      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

      【讨论】:

        【解决方案3】:

        有一个名为Swapper 的函数,它接受一个切片并返回一个交换函数。此交换函数采用 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)
        }
        
        

        Try it

        输出

        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
        

        【讨论】:

          【解决方案4】:

          是的,您可以使用交换

          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

          【讨论】:

            【解决方案5】:

            您可以像这样使用^ 选项...

            func swap(nums []int, i, j int) {
                nums[i] ^= nums[j]
                nums[j] ^= nums[i]
                nums[i] ^= nums[j]
            }
            

            【讨论】:

            • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多