You can port the Go runtime to a system that doesn’t implement threads. An example would be the current WebAssembly port. func newosproc(mp *m) { panic("newosproc: not implemented") } But if you want to run a bare metal Go program on multiple cores the thread abstraction is a must, unless you are ready to implement a completely new goroutine scheduler. The goroutine scheduler uses operating system

