# Go: Operators

*See Operator precedence for evaluation order.*

## Arithmetic

```
Operator Name Types
-------- ---- -----
+ sum integers, floats, complex values, strings
- difference integers, floats, complex values
* product integers, floats, complex values
/ quotient integers, floats, complex values
% remainder integers
& bitwise AND integers
| bitwise OR integers
^ bitwise XOR integers
&^ bit clear (AND NOT) integers
<< left shift integer << unsigned integer
>> right shift integer >> unsigned integer
```

See Arithmetic operators in the Go language specification for complete definitions of the shift, quotient and remainder operators, integer overflow, and floating point behavior.

## Comparison

Comparison operators compare two operands and yield an untyped boolean value.

```
Operator Name Types
-------- ---- -----
== equal comparable
!= not equal comparable
< less integers, floats, strings
<= less or equal integers, floats, strings
> greater integers, floats, strings
>= greater or equal integers, floats, strings
```

- Boolean, integer, floats, complex values and strings are comparable.
- Strings are ordered lexically byte-wise.
- Two pointers are equal if they point to the same variable or if both are nil.
- Two channel values are equal if they were created by the same call to make or if both are nil.
- Two interface values are equal if they have identical dynamic types and equal concrete values or if both are nil.
- A value x of non-interface type X and a value t of interface type T are equal if t’s dynamic type is identical to X and t’s concrete value is equal to x.
- Two struct values are equal if their corresponding non-blank fields are equal.
- Two array values are equal if their corresponding elements are equal.

## Logical

Logical operators apply to boolean values. The right operand is evaluated conditionally.

```
Operator Name Description
-------- ---- -----------
&& conditional AND p && q denotes "if p then q else false"
|| conditional OR p || q denotes "if p then true else q"
! NOT !p denotes "not p"
```

## Others

```
Operator Name Description
-------- ---- -----------
& address of &x generates a pointer to x
* pointer indirection *x denotes the variable pointed to by x
<- receive <-ch is the value received from channel ch
```

## Comments