Пустая структура struct{
Пустая структура struct{} - это структура без полей.
Главная ее особенность в том, что она не занимает памяти.
Размер экземпляра struct{} равен нулю байт.
Это делает ее идеальным кандидатом для ситуаций, когда важна только информация о существовании значения, а не само значение.
Синтаксис
var s struct{}
// или
s := struct{}{}
Объявление переменной типа struct{} не требует выделения памяти.
Это полезно для создания множеств (set) на основе map, где ключи важны, а значения - нет.
Пример
Рассмотрим использование struct{} для создания множества строк.
Мы будем использовать map[string]struct{}, где ключ - это элемент множества, а значение - пустая структура.
package 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)
}
Результат выполнения кода:
apple exists: true
grape exists: false
Здесь struct{} используется как заглушка для значения, так как нам важно только наличие ключа в карте.
Пример
Еще одно распространенное применение struct{} - это отправка сигналов через каналы.
Канал типа chan struct{} используется для уведомления о событии без передачи данных.
package 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.")
}
Результат выполнения кода:
Waiting for signal...
Signal received, exiting.
В этом примере канал done типа chan struct{} используется для синхронизации горутин.
Закрытие канала служит сигналом для основной горутины о завершении работы.
Использование struct{} вместо, например, bool подчеркивает, что передается только факт события, а не данные.
Смотрите также
-
концепцию
структур в Go,
основы работы с составными типами -
особенности
сравнения структур,
включая сравнение пустых структур -
использование
функции new,
которая выделяет память для структуры -
применение
структурных литералов,
для создания экземпляров структур