Обмен переменных в go

Часто в процессе написания программ, возникает необходимость обменять значения двух переменных. Банальная операция. Давайте вспомним некоторые способы сделать это.
Классика, с использованием третье переменной:

Обмен переменных в go - 897762368231
Сложение и вычитание:
Обмен переменных в go - 897762464743
Вычитание и сложение:
Обмен переменных в go - 897762526183
Умножение и деление
Обмен переменных в go - 897762634215
Битовые операторы
Обмен переменных в go - 897762716903

Это были классические алгоритмы. Но синтаксис языка go, позволяет сделать это более изящно:
Обмен переменных в go - 897762853351

Комментарии

  • 18 авг 2020 11:31
    И каким же из перечисленных ранее способом он (ЯВУ go) обменивает изящным способом, по вашему?
  • 18 авг 2020 15:32
    Множественное присваивание позволяет не использовать третьей переменной. Это легко читается и сокращает код. Причем таким образом можно и больше переменных обменять - это все равно будет одна строка.
    b, a, d, c = a, b, c, d
  • 20 авг 2020 01:27
    Про преимущество множественного присваивания я это понял уже, но это язык высокого уровня (ЯВУ), а любой язык программирования использует компилятор, а компилятор написан на низкоуровнем языке (машинном языке), так вот вопрос и том, каким способом использует компилятор GO?
  • Комментарий удалён.
  • 20 авг 2020 01:39
    Мои рассуждения и предположение: в данном посте используется пример с двумя переменными и это простой случай, когда можно использовать любой способ, а если рассмотреть общий случай, когда переменных в множественном присваивании больше двух, тогда использование способов сложение-вычитание, умножение-деление и битовыми операторами не целесообразно, так как строку (множественное присваивание) нужно подтвергать сложному анализу, другое дело, использовать классический способ - третью переменную. Мой вывод: компилятор GO использует при множественном присваивании способ с использованием третьей переменной.
  • 20 авг 2020 07:47
    Нет, не все языки являются компилируемыми. Например JS, PHP, Python и многие другие - интерпретируемые. Действительно, приведенные примеры, это скорее академическая задача, т.к. расходы на вычисления, в большинстве случаев гораздо затратней, чем выделение памяти под третью переменную. В какой то мере тут может конкурировать только битовые операции, т.к. например сдвиг регистра, гораздо эффективней операции сложения. Что касается конкретно GO, то тут все несколько иначе. Дело в том, что множественное присваивание, реализовано на уровне самого языка. Функции GO так же могут возвращать более одного значения. Разработчики сильно заморочились над этим и компилятор языка весьма неплохо оптимизирует эту операцию. Где то на habr была подробная статья, о том как оптимизатор это делает. Там на самом деле достаточно много нюансов, но на сколько я помню, там активно используется стек. Стек работает весьма быстро, т.к. не использует выделение памяти каждый раз.
  • 20 авг 2020 09:45
    Строго говоря, выбор метода сильно зависит от решаемой задачи. Если речь идет об обмене нескольких десятков миллионов значений, то тут может оказаться важна каждая мелочь. Выделение третьей переменной, скажем типа int (в GO int != int32), может сказаться как на объеме памяти, так и на производительности. Скорее всего тут было бы лучше применить битовые операции. Однако это не панацея.