Last week Go 1.20 was released! It did include a few changes to the Go spec, but none of them affect the portions we’ve covered so far in this series, so we’ll just continue on our merry way…
A variable is a storage location for holding a value. The set of permissible values is determined by the variable’s type.
A variable declaration or, for function parameters and results, the signature of a function declaration or function literal reserves storage for a named variable. Calling the built-in function
new
or taking the address of a composite literal allocates storage for a variable at run time. Such an anonymous variable is referred to via a (possibly implicit) pointer indirection.
This is pretty straight forward, and should be a concept familiar to anyone who has ever done any computer programming at all.
A variable is a place in memory to store a value. Ta-da!
The only real nuance here is that variable declarations come in two vareities, those that reserve space for the variable directly (i.e. var x int
), and those that reserve space for an anonymous variable, referred to via a pointer (i.e. var x = new(int)
).
It’s important that the use of new
(or a composite literal) allocates space for the pointed-to value, becuase if you just use var x *int
, for example, you end up with space allocated for x
, but not for the value it points to. In this case, x
would be a valid variable, initialized with the default zero value of nil
. And an attempt to dereference it will cause a panic, not an empty/zero int
value.
Quotes from The Go Programming Language Specification, Version of January 19, 2023