У меня есть давно работающий сервер, написанный на Go. Main запускает несколько горутин, в которых выполняется логика программы. После этого main ничего полезного не делает. Как только main выйдет, программа закроется. Метод, который я сейчас использую для поддержания работы программы, — это простой вызов fmt.Scanln(). Я хотел бы знать, как другие удерживают main от выхода. Ниже приведен базовый пример. Какие идеи или лучшие практики можно было бы здесь использовать?
Я думал о создании канала и отсрочке выхода из main путем получения на указанном канале, но я думаю, что это может быть проблематично, если все мои горутины в какой-то момент станут неактивными.
Примечание: на моем сервере (не в примере) программа на самом деле не подключена к оболочке, поэтому в любом случае не имеет смысла взаимодействовать с консолью. Пока это работает, но я ищу «правильный» способ, если он есть.
package main
import (
"fmt"
"time"
)
func main() {
go forever()
//Keep this goroutine from exiting
//so that the program doesn't end.
//This is the focus of my question.
fmt.Scanln()
}
func forever() {
for ; ; {
//An example goroutine that might run
//indefinitely. In actual implementation
//it might block on a chanel receive instead
//of time.Sleep for example.
fmt.Printf("%v+\n", time.Now())
time.Sleep(time.Second)
}
}