Yes. You can make a slice with zero length but the required capacity and append to it as you go. You can also make a slice of the estimated length and then reslice to the actual length.
In the append case, since the underlying slice has capacity, then each append will just extend the length. If estimated length was too small, then reallocation would occur.
In the reslice case, the new slice is a value type that points to the original underlying memory, with a length that is shorter. So no reallocation.