Short answer is that you cannot modify the length or capacity of a slice value object.
Let me illustrate how I think about this.
A slice is a 3-word value, with the 3 words being length, capacity (how far length can go before being out of bounds of the backing array), and a pointer to the first element of the slice in the backing array.
In typical usage, you don't modify length and capacity of a slice. These are only changed by re-slicing and append, both of which return a new 3-word slice value.
The append call may allocate a new backing array, if the number of items to append moves the length past its capacity.
e.g.
var a [8]int
var b = a[2:6] // now b's backing array is a, with len=4, cap=6, and ptr to first element is a[2]
var c = append(b, 7) // now c's backing array is a, with len=5, cap=6, and ptr to first element is a[2]
var d = append(c, 8, 9, 10) // now d's backing array is a new allocated array, with len=8, cap=UNKNOWN (but retrievalable via cap function), and ptr to first element is UNKNOWN
The only way I know to possibly modify length without creating a new slice value, is the reflect.SetLen and reflect.SetCap calls. However, reflection does its own allocation which means you save nothing really.