Пустая структура struct{

Пустая структура struct{} - это структура без полей. Главная ее особенность в том, что она не занимает памяти. Размер экземпляра struct{} равен нулю байт. Это делает ее идеальным кандидатом для ситуаций, когда важна только информация о существовании значения, а не само значение.

Синтаксис

govar s struct{}
// или
s := struct{}{}

Объявление переменной типа struct{} не требует выделения памяти. Это полезно для создания множеств (set) на основе map, где ключи важны, а значения - нет.

Пример

Рассмотрим использование struct{} для создания множества строк. Мы будем использовать map[string]struct{}, где ключ - это элемент множества, а значение - пустая структура.

gopackage main

import "fmt"

func main() {
  set := make(map[string]struct{})
  set["apple"] = struct{}{}
  set["banana"] = struct{}{}
  set["apple"] = struct{}{} // дубликат не добавится

  _, ok := set["apple"]
  fmt.Println("apple exists:", ok)

  _, ok = set["grape"]
  fmt.Println("grape exists:", ok)
}

Результат выполнения кода:

goapple exists: true
grape exists: false

Здесь struct{} используется как заглушка для значения, так как нам важно только наличие ключа в карте.

Пример

Еще одно распространенное применение struct{} - это отправка сигналов через каналы. Канал типа chan struct{} используется для уведомления о событии без передачи данных.

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  done := make(chan struct{})

  go func() {
    time.Sleep(2 * time.Second)
    close(done) // сигнал о завершении
  }()

  fmt.Println("Waiting for signal...")
  <-done
  fmt.Println("Signal received, exiting.")
}

Результат выполнения кода:

goWaiting for signal...
Signal received, exiting.

В этом примере канал done типа chan struct{} используется для синхронизации горутин. Закрытие канала служит сигналом для основной горутины о завершении работы. Использование struct{} вместо, например, bool подчеркивает, что передается только факт события, а не данные.

Смотрите также