Этот вопрос проверяет знание о важной концепции Go — горутинах, которые позволяют эффективно обрабатывать конкурентные задачи в многозадачных приложениях. Также важно понять, как правильно остановить горутину, чтобы избежать утечек памяти.
Горутина — это легковесный поток выполнения, который запускается с помощью ключевого слова go. Остановить горутину можно, отправив сигнал через канал (channel), который горутина должна проверять в своем коде.
Горутины — это параллельные потоки выполнения, которые позволяют выполнять несколько операций одновременно, не блокируя основную программу. Они запускаются с помощью ключевого слова go. В отличие от традиционных потоков, горутины в Go являются легковесными, что позволяет одновременно запускать тысячи горутин.
Пример создания горутины:
package main
import "fmt"
import "time"
func printMessage(msg string) {
for i := 0; i < 5; i++ {
fmt.Println(msg)
time.Sleep(time.Second)
}
}
func main() {
go printMessage("Hello from goroutine!") // Запуск горутины
time.Sleep(time.Second * 6) // Ожидание завершения горутины
}Чтобы остановить горутину, можно использовать каналы для передачи сигнала, который горутина будет проверять. Для этого создается канал, в который передается сигнал об остановке.
Пример остановки горутины с помощью канала:
package main
import "fmt"
func doWork(stopCh chan bool) {
for {
select {
case <-stopCh: // При получении сигнала из канала завершаем работу
fmt.Println("Goroutine stopped")
return
default:
fmt.Println("Working...")
}
}
}
func main() {
stopCh := make(chan bool)
go doWork(stopCh)
// Симулируем работу
fmt.Println("Main is working...")
stopCh <- true // Остановка горутины
}