Базовый запрос по обмену и назначению кортежей - PullRequest
0 голосов
/ 05 июля 2018

Если я хочу поменять местами значения двух переменных в 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 голосов
/ 05 июля 2018

В 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...