:= make([]reflect.SelectCase, len(chans)) for i, ch := range chans { cases[i] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)} } chosen, value, ok := reflect.Select(cases) // ok == true если канал не закрыт 11
заблокировать доступ к ресурсу mu.Unlock() // разблокировать доступ к ресурсу var mu sync.RWMutex // Как обычный mutex плюс mu.RLock() // блокировать ресурс на чтение mu.RUnlock() // разблокировать ресурс на чтение 1. 2. 12
быть раньше чем в исто c.Wait() // ждем изменения, работаем со значением или c.Wait() c.L.Unlock() // --- c.L.Lock() // вызов источнике изменений c.Broadcast() // сигнал об изменении, c.Signal() - для одной г c.L.Unlock() 15
interface{} { return new(bytes.Buffer) } } // использование b := bufPool.Get().(*bytes.Buffer) b.Reset() // нужно сбросить состояние перед использованием bufPool.Put(b) // вернуть в pool 18
если отличаются atomic.Swap* // поменять значения местами atomic.Load* // прочитать значение atomic.Store* // записать значение atomic.Value // позволяет читать/писать занчение типа interface{} 1. 2. 3. 4. 5. 6. 20