Тех собес на Golang Developer в ****

Доступно с премиум-подпиской

Оформите премиум-подписку, чтобы получить доступ к:

  • Фильтрации по компаниям
  • Названиям компаний в интервью
  • Видеозаписям собеседований
(2025-01-28)

Общие вопросы

— Вопросы по опыту

— По 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 }