Метод sync.Map.Load

Метод sync.Map.Load позволяет безопасно читать значение из конкурентной карты sync.Map. В первый параметр метод принимает ключ типа any, по которому нужно получить значение. Метод возвращает два значения: само значение типа any и булев флаг, который показывает, существует ли ключ в карте. Если ключа нет, возвращается нулевое значение для типа и false.

Синтаксис

govalue, ok := m.Load(key)

Пример

Давайте создадим карту sync.Map, сохраним в нее значение и прочитаем его методом Load:

gopackage main

import (
  "fmt"
  "sync"
)

func main() {
  var m sync.Map

  // Сохраняем значение по ключу "name"
  m.Store("name", "John")

  // Читаем значение по ключу
  value, ok := m.Load("name")
  fmt.Println(value, ok)
}

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

go"John" true

Пример

Давайте попробуем прочитать значение по несуществующему ключу:

gopackage main

import (
  "fmt"
  "sync"
)

func main() {
  var m sync.Map

  // Читаем значение по несуществующему ключу
  value, ok := m.Load("age")
  fmt.Println(value, ok)
}

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

go<nil> false

Пример

Давайте продемонстрируем, что метод Load безопасно использовать одновременно из нескольких горутин:

gopackage main

import (
  "fmt"
  "sync"
)

func main() {
  var m sync.Map
  var wg sync.WaitGroup

  // Сохраняем значение
  m.Store("counter", 42)

  // Запускаем 10 горутин для чтения
  for i := 0; i < 10; i++ {
    wg.Add(1)
    go func() {
      defer wg.Done()
      value, ok := m.Load("counter")
      if ok {
        fmt.Printf("Read: %d\n", value)
      }
    }()
  }

  wg.Wait()
}

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

go"Read: 42"
"Read: 42"
"Read: 42"
"Read: 42"
"Read: 42"
"Read: 42"
"Read: 42"
"Read: 42"
"Read: 42"
"Read: 42"

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

  • метод sync.Map.Store,
    который сохраняет значение по ключу в карте
  • метод sync.Map.LoadOrStore,
    который загружает или сохраняет значение
  • метод sync.Map.LoadAndDelete,
    который загружает и удаляет значение
  • метод sync.Map.Delete,
    который удаляет значение по ключу