Crtex · июль 2024

Тех собес на middle-senior Golang Разработчик в Crtex

middle-senior Тех собес 4 задачи
1

Code Analysis

1. Задача: Проанализируйте данный код на 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) 
}

2. Задача: Проанализируйте данный код на Go, работающий с map. Будет ли ошибка при выполнении получения адреса элемента map? Если да, то почему?

package main 
 
import "fmt" 
 
func main() { 
    m := make(map[string]int) 
    m["1"] = 0 
   fmt.Printf("%v", &m["1"]) 
}

3. Задача: Проанализируйте данный код на Go, демонстрирующий работу с интерфейсами и nil. Что выведет сравнение интерфейсов и почему 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) 
}

4. Задача: Проанализируйте данный код на Go, использующий defer. В каком порядке и с какими значениями будут вызваны функции печати?

package main 
 
import ( 
 "fmt" 
) 
 
func main() { 
 a := 10 
 defer func() { fmt.Println("call 0 ", a+10) }() 
 defer fmt.Println("call 1 ", a+10) 
 a++ 
 fmt.Println("call 2 ", a) 
}