I'll explain how 'slices' work as best I can, but it might be worth also reading this official go post on the subject: https://blog.golang.org/go-slices-usage-and-internals (it has some nice visual aids too).
A 'slice' is a data structure abstraction around the 'Array' composite data type.
An array is a fixed size and can't be resized once it is full. A slice also cannot dynamically grow larger at runtime, we must create a new slice, and this requires the use of the appropriate builtin functions.
The reason we have to use the builtin
append function is because the slice data structure includes a pointer to an array in memory. When appending more data than can be fit into the underlying array, the slice will copy the original array data to a new array and will return a new slice with an updated pointer.
So if you tried to append the values "a", "b" and "c" to a slice