Как создать переменую областью видимости пакета,чтобы не видели другие горутины и без их блокировки?

В языке программирования 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, вы можете создать переменные с областью видимости только для одной горутины без блокировки доступа от других горутин.