У меня длинный сервер, написанный на Go. Main запускает несколько goroutines, где выполняется логика программы. После этого главное ничего не делает. Как только основные выходы, программа прекратит работу. Метод, который я использую сейчас, чтобы поддерживать работу программы, - это просто вызов fmt.Scanln(). Я хотел бы знать, как другие держат основную часть от выхода. Ниже приведен базовый пример. Какие идеи или рекомендации могут быть использованы здесь?
Я считал создание канала и задержку выхода из основного, получая по указанному каналу, но я думаю, что это может быть проблематично, если все мои goroutines станут неактивными в какой-то момент.
Боковое примечание: на моем сервере (а не в примере) программа фактически не подключена к оболочке, поэтому на самом деле не имеет смысла взаимодействовать с консолью. Пока это работает, но я ищу "правильный" способ, предполагая, что он есть.
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)
}
}