diff --git a/docs/popular_tasks/README.md b/docs/popular_tasks/README.md index 6014f6f..e30ca6e 100644 --- a/docs/popular_tasks/README.md +++ b/docs/popular_tasks/README.md @@ -325,4 +325,101 @@ func main() { sem.Dec(n) } -``` \ No newline at end of file +``` + +### 7. Что выведет код? + +```go +package main + +import ( + "fmt" +) + +func main() { + runtime.GOMAXPROCS(1) + + done := false + + go func() { + done = true + }() + + for !done { + } + fmt.Println("finished") +} +``` + +
+ Ответ или подсказка + Как можно изменить этот код, чтобы был вывод “finished”? +
+ +### 8. Какая есть проблема в коде? + +```go +var counter int +for i := 0; i < 1000; i++ { + go func() { + counter++ + }() +} +``` + +
+ Ответ или подсказка + Как её можно решить? + А как её можно бы было решить, если бы в языке не было пакета sync? +
+ +### 9. Что выведет код? + +```go +func main() { + v := 5 + p := &v + println(*p) + + changePointer(p) + println(*p) +} + +func changePointer(p *int) { + v := 3 + p = &v +} +``` + +
+ Ответ или подсказка + Почему? Как нужно изменить функцию changePointer, чтобы вывело 5 и 3 (в оригинальной версии выводится 5 и 5)? +
+ +### 10. Что выведет код? + +```go +func worker() chan int { + ch := make(chan int) + + go func() { + time.Sleep(3 * time.Second) + ch <- 42 + }() + + return ch +} + +func main() { + timeStart := time.Now() + + _, _ = <-worker(), <-worker() + + println(int(time.Since(timeStart).Seconds())) // что выведет - 3 или 6? +} +``` + +
+ Ответ или подсказка + Что нужно изменить, чтобы код работал за 3 секунды? +