Каналы, оператор for ch := make(chan DataType, capacity) // создать close(ch) // закрыть ch <- struct{}{} // запись data <- ch // чтение for data := range ch { ... } // чтение через цикл 1. 2. 3. 4. 5
Оператор select select { case ch <- 4: // была запись в канал case v := <-ch: // произошло чтение из канала default: // ничего из вышеперечисленного } 6
sync.Mutex, sync.RWMutex var mu sync.Mutex // создать mutex mu.Lock() // заблокировать доступ к ресурсу mu.Unlock() // разблокировать доступ к ресурсу var mu sync.RWMutex // Как обычный mutex плюс mu.RLock() // блокировать ресурс на чтение mu.RUnlock() // разблокировать ресурс на чтение 1. 2. 12
sync.WaitGroup Когда нужно дождаться выполнения всех горутин var wg sync.WaitGroup for _, task := range tasks { wg.Add(1) go func() { task.Do(); wg.Done() } } wg.Wait() 13
sync.Once Выполнение кода один раз, ленивая загрузка var once sync.Once for i := 0; i < 10; i++ { go func() { // иницализация будет выполнена один раз once.Do(lazyInitialize) }() } 14
sync.Cond c := sync.NewCond(&sync.Mutex{}) c.L.Lock() // вызов в горутинах, должен быть раньше чем в исто c.Wait() // ждем изменения, работаем со значением или c.Wait() c.L.Unlock() // --- c.L.Lock() // вызов источнике изменений c.Broadcast() // сигнал об изменении, c.Signal() - для одной г c.L.Unlock() 15
sync.Pool Многократное повторное использование объектов bufPool := sync.Pool{ New: func() interface{} { return new(bytes.Buffer) } } // использование b := bufPool.Get().(*bytes.Buffer) b.Reset() // нужно сбросить состояние перед использованием bufPool.Put(b) // вернуть в pool 18
atomic atomic.Add* // изменение значения atomic.CompareAndSwap* // поменять значения местами если отличаются atomic.Swap* // поменять значения местами atomic.Load* // прочитать значение atomic.Store* // записать значение atomic.Value // позволяет читать/писать занчение типа interface{} 1. 2. 3. 4. 5. 6. 20
Ссылки Effective Go Go by Example Разбираемся с новым sync.Map в Go 1.9 Concurrency Patterns In Go GopherCon 2017: Kavya Joshi - Understanding Channels 1. 2. 3. 4. 5. 21