A trimmer is used to refer to a subset of values in a multiple’s dimension while slicing. For example, in the slice:slice
foo[1:5]
The trimmer 1:5
refers to the values with index 1
to
5
in the only dimension of the multiple foo
. The action
of applying a trimmer is known as trimming, and it always yields
a slice.
The multiple resulting from the slice above will have lower bound
1
an upper bound 5
, but it is possible to “rebound”
the result of trimming by using revised bounds. Consider:
[]int foo = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10); []int trim1 = foo[6:10]; []int trim2 = foo[6:10 at 1]; []int trim3 = foo[6:10 @ 1];
Where trim1
has lower bound 6
and upper bound 10
,
and both trim2
and trim3
have lower bound 1
and
upper bound 5
. All trim1
, trim2
and trim3
contain values 6, 7, 8, 9, 10
. Note that at and @ are
alternative representations of the “at token”.
All components of a trimmer are optional. If the lower bound of the
trimmer is omitted (as in [:5]
) then it defaults to the lower
bound of the multiple’s dimension. If the upper bound of the trimmer
is omitted (as in [1:]
) then it defaults to the upper bound of
the multiple’s dimension. Both bounds can be omitted, resulting in
:
or simply an empty string, such as in the slice
foo[2,]
. If the lower bound revision part is omitted, the
bounds of the resulting multiple are the same than the bounds
specified in the trimmer (or implied by the trimmer.)
Simplified [RR 5.3.2.f,g]:
f) trimmer : lower bound option, up to token, upper bound option, revised lower bound option. g) revised lower bound : at token, lower bound.