"thread" here refers to logical thread. A single logical thread can be used to run any number of goroutines, just one at a time.
https://en.wikipedia.org/wiki/Cooperative_multitasking
How this works in Go ? Thoroughly simplified it happens because at every flow control statement in Go, including function calls, what really happens is that, first, Go asks it's runtime to switch goroutines, and only then goes into the if, or subroutine, or ...