Note that all of this is an implementation detail. The runtime does something based, presumably, on statistics and experience to provide good performance without wasting too much memory. The exact sizes are not defined in any spec and can vary from release to release. All in all, it’s not something that should matter…
As @calmh pointed out, it is an implementation detail that should not bother you when writing Go code. The more important aspect about append is the unexpected effect it can have when two slices point to the same region of the underlying array. Updating the element of one slice also changes the other slice, but when one of the two slices expands beyond capacity, it allocates a new array and the two slices do not influence each other anymore.
The slightly longer answer is sometimes, for small slices, they grow by mor than double. The reason for this is something called a size clas, which is a technique used inside the runtime to avoid fragmentation with small allocations. As sizes get larger, the more they deviate from a powers of two scheme.
Once the size of a slice passes about 1k, it will grow by 1.25x