Constants
In a previous post I said go does not have immutable types. I was only half right. Go does have constants denoted with const
but its not comparable to final
in Java or const
in JavaScript because const
in go only works with basic types and for things we can know in compile time. Like boolean values, integer, floating point, characters, runes and strings. We can not create constants of composite types like struct, func or interface. All values must be known at compile time. You could store almost any arbitrary numeric constant in a untyped const. The problem happens when you try to use the value.
const (
BigConst = math.MaxFloat64 * math.MaxFloat64
)
If you have this at the top of your go code and compile the code. It will be fine. But if you try to print this or try to cast
fmt.Println(BigConst) // this code wont compile
This code won’t compile because BigConst
won’t fit in a float64
.
iota
We can generate a series of constants with iota
constant generator.
const (
a0 = iota // 0
a1 = iota // 1
a2 = iota // 2
a3 = iota // 3
)
We can also use the shorthand by skipping assignment to set values for a series of constants.
const (
b0 = iota // 0
b1 // 1
b2 // 2
b3 // 3
)
If we skip one or two value the iota
generator continues counting.
const (
c0 = iota // 0
c1 = 43
c2 = 75
c3 = iota // 3
)
I can’t imagine a scenario where this will be useful though. But it’s there.
iota
generator is reevaluated per const
block.
const d0 = iota //0
const d1 = iota //0
const d2 = iota //0
const d3 = iota //0
const
is uses almost like enum
in other languages or for mathmetical constants.
Operators
Go supports a number of operators. Some of them are arithmetic operators. Some are punctuation. Other have specific meaning based on context.
+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
&^ &^=
The official language spec talks about each of the operator in great details.
Operators that are used for calculating values have a set precedence order. Operators of same precedence get evaluated left to right.
Precedence Operator
5 * / % << >> & &^
4 + - | ^
3 == != < <= > >=
2 &&
1 ||
For example
x := 5*10 + 6/3 | 7%4&15
// (5*10) + (6/3) | (7%4)&15 => 50 + 2 | 3&15 => 52 | 3 = 55
This evaluates without ambiguity. But this is a classic example of just because you could, does not mean you should. This is not easily human readable. Using proper brackets will increase readability.
Reserved Keywords
Go has a fairly small set of reserved keywords. Other languages has a fairly large reserved keywords. c++ 95, Java 53, JS 64 etc. Go has only 25 reserved keywords. Reserved keyword mean in the syntax we are not allowed name anything with this names.
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
Having such a limited set of keywords has some drawbacks too.
As you can see none of the types are actually part of the reserved keywords. So one can create a variable called int. Now if we try to create a variable of type int, it won’t work.
int := 10 // this is valid code
var c int = 10 // this doesnt work now
Next Steps
This is Part 5 of this Go crash course series.