Code Analysis
- Проанализируйте данный код на Go, использующий каналы и WaitGroup. Каков будет результат выполнения программы?
package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan int)
wg := &sync.WaitGroup{}
wg.Add(3)
for i := 0; i < 3; i++ {
go func(v int) {
defer wg.Done()
ch <- v * v
}(i)
}
go func() {
wg.Wait()
close(ch) // Закрываем канал после завершения всех горутин
}()
var sum int
for v := range ch {
sum += v
}
fmt.Printf("result: %dn", sum)
}
- Проанализируйте данный код на Go, работающий с map. Будет ли ошибка при выполнении
fmt.Printf("%v", &m["1"])? Если да, то почему? (Подсказка: будет ошибка)
package main
import "fmt"
func main() {
m := make(map[string]int)
m["1"] = 0 // Используем оператор `=` для присваивания значения
fmt.Printf("%v", &m["1"]) // Печатаем значение элемента по ключу "1"
}
- Проанализируйте данный код на Go, демонстрирующий работу с интерфейсами и nil. Что выведет
fmt.Println(a == b)? Объясните, почему ‘nil бывает разный’.
package main
import "fmt"
type impl struct{}
type I interface {
C()
}
func (*impl) C() {}
func A() I {
return nil
}
func B() I {
var ret *impl
return ret
}
func main() {
a := A()
b := B()
fmt.Println(a == b)
}
- Проанализируйте данный код на Go, использующий
defer. В каком порядке и с какими значениями будут вызваны fmt.Println? (Подсказки: call 0 -> 21, call 1 -> 20, call 2 -> 11)
package main
import (
"fmt"
)
func main() {
a := 10
defer func() { fmt.Println("call 0 ", a+10) }() //21
defer fmt.Println("call 1 ", a+10) //20
a++
fmt.Println("call 2 ", a) //11
}