2021-03-05 11:27:37 +00:00
|
|
|
## once
|
|
|
|
|
|
|
|
[sync.Once](https://golang.org/pkg/sync/#Once) решает задачу ленивой инициализации.
|
|
|
|
|
|
|
|
Как правило, `sync.Once` используется для того, чтобы гарантировать, что некоторый код многопоточной программы будет выполнен ровно один раз.
|
|
|
|
|
|
|
|
### Что нужно сделать?
|
|
|
|
|
2022-03-06 02:06:00 +00:00
|
|
|
Нужно написать реализацию Once, используя каналы.
|
2021-03-05 11:27:37 +00:00
|
|
|
|
|
|
|
Использование пакета [sync](https://golang.org/pkg/sync) в этой задаче запрещено!
|
|
|
|
|
|
|
|
```go
|
|
|
|
type Once struct {}
|
|
|
|
|
|
|
|
func (o *Once) Do(f func()) {}
|
|
|
|
```
|
|
|
|
|
|
|
|
`Do` вызывает функцию `f` тогда и только тогда, когда `Do` вызывается впервые для данного экземпляра `Once`.
|
|
|
|
|
|
|
|
Важное свойство: код `f` должен завершиться до того, как завершится любой из конкурентных `Do`.
|