Общие вопросы
— Вопросы по опыту
— По Go: слайсы, мапы, асинхронность с мапой, зачем нужны: sync.Map, WaitGroup, errgroup, немного про каналы внутри
Задача 1
Что выведет и почему?
Что изменится, если раскомментить строку в mod?
Если еще раскомментить строку в main?
func mod(a []int){
//a = append(a, 125)
for i := range a {
a[i] = 5
}
fmt.Println(a)
}
func main(){
//sl := make([]int, 0, 10)
sl:= []int{1,2,3,4}
mod(sl)
fmt.Println(sl)
}
Задача 2
Что выведется? Предложить способ, при котором выведется 1
func main(){
i:=0
defer fmt.Println(i)
i++
return
}
Задача 3
Что выведется? Как можно исправить?
func main(){
wg := new(sync.WaitGroup)
for i:=0;i<10;i++{
wg.Add(1)
go func(){
fmt.Println(i)
wg.Done()
}
}
wg.Wait()
}
Задача 4
Что выведет код?
func main() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
time.Sleep(time.Second * 2)
fmt.Println("1")
wg.Done()
}()
wg.Wait()
go func() {
fmt.Println("2")
}()
fmt.Println("3")
}
Задача 5
Исправить код, меняя логику и названия переменных на правильные. Сделать так, чтобы вывод был 55 (сумма цифр от 0 до 9)
// Тестировщик пришел с неправильно работающим методом
// Должно быть 55, но почему-то выводит рандомное число 97-100, а иногда код не выводит ничего или только часть логов
// Новый тимлид посмотрел на код и стал плакать, сказал что все нужно переписывать
// Нужно найти ошибку и исправить, вместе с этим переписать код так чтобы тимлид перестал плакать
var sinker sync.Mutex
var count = counter.Counter{Count: 0}
func main() {
kolvo := 0
for _ = range [10]int{} {
kolvo++
go func() {
sinker.Lock()
func() {
defer func() { recover() }()
defer fmt.Println()
count.Inc(kolvo)
fmt.Printf("log kolvo = %v (dobavil = %d)", count.Get(), kolvo)
}()
sinker.Unlock()
}()
}
time.Sleep(1)
fmt.Printf("resultat kolvo = %v", count.Get())
}
-- counter/counter.go --
package counter
type Counter struct { Count int }
func (counter *Counter) Inc(kolvo any) { counter.Count += kolvo.(int) }
func (counter *Counter) Dec(kolvo any) { counter.Count -= kolvo.(int) }
func (counter Counter) Get() int { return counter.Count }