Here's what you learned in this section:
Slices are flexible views into underlying arrays
Use make([]T, len, cap) to pre-allocate
len() gives accessible elements, cap() gives available space
append returns a new slice. Always assign the result
Slices share underlying arrays. Modifications affect all
copy creates independent data
Pre-allocate capacity when size is known
Slices work well as stacks, less so as queues