22 lines
1 KiB
Markdown
22 lines
1 KiB
Markdown
|
## once
|
||
|
|
||
|
[sync.Once](https://golang.org/pkg/sync/#Once) решает задачу ленивой инициализации.
|
||
|
|
||
|
Как правило, `sync.Once` используется для того, чтобы гарантировать, что некоторый код многопоточной программы будет выполнен ровно один раз.
|
||
|
|
||
|
### Что нужно сделать?
|
||
|
|
||
|
Нужно написать реализацию Once используя каналы.
|
||
|
|
||
|
Использование пакета [sync](https://golang.org/pkg/sync) в этой задаче запрещено!
|
||
|
|
||
|
```go
|
||
|
type Once struct {}
|
||
|
|
||
|
func (o *Once) Do(f func()) {}
|
||
|
```
|
||
|
|
||
|
`Do` вызывает функцию `f` тогда и только тогда, когда `Do` вызывается впервые для данного экземпляра `Once`.
|
||
|
|
||
|
Важное свойство: код `f` должен завершиться до того, как завершится любой из конкурентных `Do`.
|