Golang задачи с собеседований
4.59K subscribers
486 photos
6 videos
12 files
254 links
Задачи, тесты и теоретические вопросы по Go. Так же по gin, grpc, горутинах, архитектуре api и http стэку.

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
加入频道
Можно ли безопасно конвертировать x в тип IntPtr?
Anonymous Quiz
8%
Не уверен
50%
Можно
22%
Нельзя
5%
Пойду проверю
16%
Дайте объяснение
👆Объяснение к предыдущему вопросу

👨🏻‍💻 Можно, тогда функция будет выглядеть вот так:

func convert(x MyIntPtr) (y IntPtr) {
a := (*MyInt)(x)
b := (*int)(a)
y = IntPtr(b)

return y
}
Вариант с помощью unsafe:

func convert(x MyIntPtr) (y IntPtr) {
y = IntPtr(unsafe.Pointer(x))
return
}

Golang задачи с собеседований
Какие строки приведут к ошибке компиляции?
Anonymous Quiz
21%
7, 12
18%
7, 8, 9
37%
7, 8, 9, 11, 12
25%
все строки скомпилируются
👆Объяснение к предыдущему вопросу

👨🏻‍💻 7: у вас нет адреса, так как массив это значение, которое само по себе должно быть записано в переменную, и только потом с ним можно работать => ошибка

8: здесь мы инициализируем слайс типа T со 2-м элементом == x (т.е. T{}), а потом в нулевой элемент получившегося слайса пишем значение y. Здесь всё ок, так как слайс это сложный тип, внутри работающий с указателем на массив. Именно во внутренний массив и будет записано значение y. Строка сама по себе бессмысленна, так как работать с результатом дальше нельзя. (но ошибки нет)

9: здесь мы создаем map с ключами типа int и элементами T, а дальше устанавливаем значение элемента с индексом 5 в значение y. Опять же map это сложный тип, который по факту указатель и поэтому мы можем работать со временно выделенной памятью. Опять же смысла нет, так как дальше результат использовать нельзя. (но ошибки нет)

11: здесь аналогично строке 8, но мы еще устанавливаем значение поля в 6. Проблем нет.

12: в map нельзя менять значение поля элемента, который там хранится не по ссылке (классический вопрос на Stack Overflow)

Golang задачи с собеседований
Какие строки приведут к ошибке компиляции?
Anonymous Quiz
18%
3, 7
41%
3, 8
25%
3, 7, 8, 9
16%
7, 9
👆Объяснение к предыдущему вопросу

👨🏻‍💻 Спецификация Golang гласит: Переменные, объявленные в инициализирующем операторе, переиспользуются в каждом цикле.

Из этого следует, что если мы используем адрес этой переменной, например для инициализации элементов Карты - все они будут иметь адрес указывающий на ячейку памяти с последним значением.

Golang задачи с собеседований
Что выведет код?
Anonymous Quiz
19%
3 3
19%
3 7
19%
7 3
44%
7 7
Из-за какой строки этот код не скомпилируется?
Anonymous Quiz
29%
10
28%
12
19%
15
24%
16