web-dev-qa-db-ja.com

Goで変数値を交換する最良の方法は?

Pythonのように要素を交換することは可能ですか?

a,b = b,a

または使用する必要がありますか:

temp = a
a = b
b = temp
7
Nicky Feller

はい、可能です。 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

これは合法であり、慣用的なものであるため、中間バッファーを使用する必要はありません。

29
Sam Whited

はい、タプル割り当てを使用して要素を交換することは可能です。

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

11
abhink

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)
}

試してみてください

出力

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
0