Общие операторы
Операторные операции — это операции, использующие все виды операторов. Далее мы рассмотрим общие операторы в Go.
О некоторых описаниях в объяснениях операторов
В этой и следующих главах будут представлены только арифметические операторы, побитовые операторы, операторы сравнения, логические операторы и оператор конкатенации строк. Эти операторы являются либо бинарными, либо унарными. Операция бинарного оператора принимает два операнда, а операция унарного — только один операнд.
Каждая из операций оператора, представленных в этой и следующих главах, возвращает один результат.
В материалах может присутствовать многозначность некоторых описаний. Например, когда говорится, что бинарный оператор требует, чтобы типы его двух операндов были одинаковыми, это означает следующее:
- Если оба операнда являются типизированными значениями, то их типы должны быть одинаковыми, иначе один операнд может быть неявно преобразован в тип другого.
- Если только один из двух операндов типизирован, то другой (нетипизированный) операнд должен быть представлен как значение типа типизированного операнда, или значения типа по умолчанию другого (нетипизированного) операнда могут быть неявно преобразованы в тип типизированного операнда.
- Если оба операнда являются нетипизированными значениями, то они должны быть как булевыми значениями, так и строковыми значениями или обоими базовыми числовыми значениями.
Точно так же, когда оператор, будь то бинарный или унарный, требует, чтобы один из его операндов был определенного типа, это означает следующее:
- Если операнд типизирован, то его тип должен быть или может быть неявно преобразован к этому определенному типу.
- Если операнд не типизирован, то не типизированное значение должно быть представлено как значение этого определенного типа, или значения типа операнда по умолчанию могут быть неявно преобразованы в этот определенный тип.
Постоянные выражения
Прежде чем вводить все виды операторов, мы должны знать, что такое константные выражения и факт в оценках константных выражений. Сейчас нам достаточно знать, что большинство операций, упомянутых в текущей теме, являются выражениями.
Если все операнды, участвующие в выражении, являются константами, то это выражение называется константным выражением. Все константные выражения оцениваются во время компиляции. Результат вычисления постоянного выражения остается константой.
Только если один операнд в выражении не является константой, выражение называется непостоянным.
Арифметические операторы
Go поддерживает пять основных бинарных арифметических операторов:
Оператор | Имя | Требования к двум операндам |
+ | добавление | Оба операнда должны быть значениями одного и того же базового числового типа. |
- | вычитание | |
* | умножение | |
/ | разделение | |
% | остаток | Оба операнда должны быть значениями одного и того же базового целочисленного типа. |
Пять операторов также часто называют операторами суммы, разности, произведения, частного и по модулю соответственно.
Go поддерживает шесть побитовых двоичных арифметических операторов:
Оператор | Имя | Требования к двум операндам и объяснение механизма |
& | побитовое и | Оба операнда должны быть значениями одного целочисленного типа.
|
| | побитовое или | |
^ | побитовый xor | |
&^ | побитовая очистка | |
<< | побитовый сдвиг влево | Левый операнд должен быть целым числом, правый операнд также должен быть целым числом (если это константа, то оно должно быть неотрицательным), их типы не обязательно должны быть идентичными. Обрати внимание, что до Go 1.13 правый операнд должен быть целым числом без знака или целочисленной константой без знака, которая может быть представлена как uint значение.
Примечание: в операции побитового сдвига вправо все освободившиеся биты слева заполняются знаковым битом (самым старшим битом) левого операнда. Например, если левый операнд является int8 значением -128 или в двоичной литеральной форме, то результаты, также известные как. 100000002 100000002 >> 2 111000002 -32 |
>> | побитовый сдвиг вправо |
Go также поддерживает три унарных арифметических оператора:
Оператор | Имя | Пояснения |
+ | положительный | +n эквивалентно 0 + n |
- | отрицательный | -n эквивалентно 0 - n. |
^ | побитовое дополнение (побитовое нет) | ^n эквивалентно m ^ n, где m - значение, все биты которого равны 1. Например, если тип n, int8 то m, а если -1 тип n, uint8 то . m0xFF |
Примечание:
- Во многих других языках оператор побитового дополнения обозначается как ~.
- Как и во многих других языках, бинарный оператор сложения + также может использоваться в качестве оператора конкатенации строк.
- Как и в языках C и C++, двоичный оператор умножения * также может использоваться в качестве оператора разыменования указателя, а оператор побитового «И» & также может использоваться в качестве оператора адреса указателя.
- В отличие от языка Java, Go поддерживает целочисленные типы без знака, поэтому >>> в Go не существует оператора беззнакового сдвига.
- В Go нет оператора возведения в степень, вместо этого используйте Pow функцию из math стандартного пакета.
- Оператор побитовой очистки &^ — уникальный оператор в Go. m &^ n эквивалентно m & (^n).