Работал ли с многопоточным программированием

«Работал ли с многопоточным программированием» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, работал. В Go многопоточность реализуется через горутины (goroutines) — легковесные потоки, управляемые рантаймом. Они дешевле системных потоков и позволяют эффективно выполнять конкурентные задачи.

Пример:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Worker %d startedn", id)
    // Имитация работы
    fmt.Printf("Worker %d donen", id)
}

func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }
    wg.Wait()
    fmt.Println("All workers completed")
}

Ключевые моменты:

  • Горутины запускаются через go func().
  • sync.WaitGroup синхронизирует завершение горутин.
  • Для безопасного доступа к общим данным используются мьютексы (sync.Mutex) или каналы.
  • Каналы (chan) — основной способ коммуникации между горутинами.