Yes, the main function runs in a goroutine (the main one).
According to https://tour.golang.org/concurrency/1
A goroutine is a lightweight thread managed by the Go runtime.
go f(x, y, z)
starts a new goroutine running f(x, y, z) The evaluation of f, x, y, and z happens in the current goroutine and the execution of f happens in the new goroutine.
Goroutines run in the same address space, so access to shared memory must be synchronized. The sync package provides useful primitives, although you won't need them much in Go as there are other primitives.
So according to this official document the main runs in the current goroutine.
Now let's have some fun with main and run this (So here the current goroutine runs the new goroutine) so here we have more than one goroutine which execute main() again! (Note: Access to shared memory must be synchronized):
package main
import (
"fmt"
"time"
)
var i = 3
func main() {
if i <= 0 {
return
}
i--
fmt.Println("Hi")
go main()
time.Sleep(100 * time.Millisecond)
}
output:
Hi
Hi
Hi
Let's calculate factorial using main() (one goroutine - no synchronization needed):
package main
import "fmt"
func main() {
if f <= 0 {
fmt.Println(acc)
return
}
acc *= f
f--
main()
}
var f = 5
var acc = 1
output:
120
Note: The codes above are just for clearly showing my viewpoints and is not good for production use (Using global variables should not be the first choice).