# 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