To give better context to the problem being presented in this article, we must go over how slices work.
A slice value consists of three parts: a pointer to a backing array, a length and a capacity.
Excerpt of **runtime/slice.go** from the standard library:
```go
type slice struct {
array unsafe.Pointer
len int
cap int
}
```
When calling append on a slice whose length is the same as its capacity, a new backing array of greater size is created. The previous backing array's contents are copied.
A range of elements from a slice may be selected like so: