Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Node.js: sync.WaitGroup, goroutine, pointer, concurrency, Go

Как корректно разыменовать указатель на sync.WaitGroup внутри горутины?

Вопрос проверяет понимание безопасного использования sync.WaitGroup в горутинах и правил передачи указателей в Go.

Короткий ответ

Указатель на sync.WaitGroup передается в горутину как аргумент, и внутри горутины вызывается wg.Done() для уменьшения счетчика. Нельзя разыменовывать указатель на WaitGroup вручную, так как это может привести к панике. Достаточно просто вызвать метод Done() через указатель, и WaitGroup сама управляет своим состоянием.

Длинный ответ

Передача sync.WaitGroup в горутину

В Go sync.WaitGroup используется для ожидания завершения группы горутин. Обычно WaitGroup передается в горутину по указателю, чтобы все горутины работали с одним экземпляром счетчика. Внутри горутины не требуется явно разыменовывать указатель — достаточно вызвать метод Done() через указатель, и компилятор автоматически разыменует его.

Пример кода

package main

import (
	"fmt"
	"sync"
)

func worker(wg *sync.WaitGroup, id int) {
	defer wg.Done() // безопасно, компилятор разыменует указатель
	fmt.Printf("Worker %d done\n", id)
}

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

Почему не нужно разыменовывать вручную

Методы WaitGroup (Add, Done, Wait) объявлены с получателем-указателем, поэтому при вызове через указатель Go автоматически разыменовывает его. Попытка явного разыменования, например (*wg).Done(), избыточна и может запутать код. Главное — передавать указатель, а не копию, чтобы избежать race condition.

Вывод

Используйте передачу указателя на sync.WaitGroup в горутины и вызывайте wg.Done() через defer. Это гарантирует корректную синхронизацию без лишних операций разыменования.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    4

Навыки

  • Node.js

    Node.js

Ключевые слова

#sync.WaitGroup

#goroutine

#pointer

#concurrency

#Go

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.