В языке программирования Go переменные с областью видимости пакета обычно объявляются внутри файла пакета. Это позволяет им быть доступными для всех функций в этом пакете. Тем не менее, если вам нужно создать переменную с областью видимости только внутри одной горутины без блокировки доступа от других горутин, тогда вы можете использовать конструкцию «goroutine-local storage» (хранение, локальное для горутины).
Go не предоставляет прямой поддержки для создания переменных с областью видимости только для одной горутины, но вы можете достичь желаемого эффекта, используя механизмы, такие как goroutine-local storage.
Goroutine-local storage - это механизм, предоставляемый пакетом sync
в Go, который позволяет каждой горутине сохранять своё собственное значение переменной. Для использования goroutine-local storage вы должны импортировать пакет sync
и использовать тип sync.Map
для хранения значений переменных.
Ниже приведен пример использования goroutine-local storage:
package main import ( "fmt" "sync" ) var storage sync.Map func main() { var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() storeValue("goroutine 1", "value 1") readValue("goroutine 1") }() go func() { defer wg.Done() storeValue("goroutine 2", "value 2") readValue("goroutine 2") }() wg.Wait() } func storeValue(key, value string) { storage.Store(key, value) } func readValue(key string) { if val, ok := storage.Load(key); ok { fmt.Printf("Value for key %s: %sn", key, val) } else { fmt.Printf("No value found for key %sn", key) } }
В этом примере мы создаем переменную storage
типа sync.Map
. Функция storeValue
используется для сохранения значения переменной в goroutine-local storage, а функция readValue
используется для чтения значения из goroutine-local storage.
Затем мы создаем две горутины, каждая из которых вызывает функции storeValue
и readValue
с разными ключами и значениями. Каждая горутина будет иметь свою собственную горутину-local переменную и они не будут блокироваться другими горутинами.
Выходные данные могут выглядеть примерно так:
Value for key goroutine 1: value 1 Value for key goroutine 2: value 2
Таким образом, используя goroutine-local storage, вы можете создать переменные с областью видимости только для одной горутины без блокировки доступа от других горутин.