Ниже – разбор вопросов/задачек с интервью на позицию “Middle/Senior Golang developer“.
Задачка по БД Postgres
# Составить запрос который выведет все последние проценты по всем ПВЗ
create table pickpoint_tariff
(
id bigserial,
created timestamp default now(),
pickpoint_id bigint,
percent numeric
);
# Пример:
--------------------------------------------------------
1,2,3,4,5
1 - 02.10 - 1 - 2%
2 - 02.10 - 2 - 2%
3 - 02.10 - 3 - 2%
4 - 02.10 - 4 - 2%
5 - 02.10 - 5 - 2%
6 - 03.10 - 1 - 3%
7 - 03.10 - 4 - 1%
8 - 03.10 - 2 - 5%
//
Решение:
Вот SQL запрос, который выведет последние проценты по всем ПВЗ из таблицы pickpoint_tariff:
SELECT p1.*
FROM pickpoint_tariff p1
INNER JOIN (
SELECT pickpoint_id, MAX(created) AS max_created
FROM pickpoint_tariff
GROUP BY pickpoint_id
) p2 ON p1.pickpoint_id = p2.pickpoint_id
AND p1.created = p2.max_created
Объяснение:
- Вложенный запрос агрегирует таблицу по столбцу pickpoint_id, выбирая MAX(created) для каждого ПВЗ
- Это даст последние даты для каждого ПВЗ
- Затем эти подзапрос соединяется с основной таблицей
- Условие ON выберет для каждого ПВЗ только запись с максимальной датой (последние проценты)
- В результат попадут последние проценты для каждого уникального pickpoint_id
Такой подход часто используется для выборки последних значений из истории.
Задачки по GoLang
Задача №1
# Задача 1. Что выведет функция?
func main() {
i := int32(math.Pow(2, 64))
println(i)
}
Ответ №1 (нейросеть)
Эта программа на Go выведет 0, по следующим причинам:
- Функция math.Pow возводит число 2 в степень 64 и возвращает значение типа float64. Результат будет очень большим числом (
1.8446744073709552e+19
). - Это значение преобразуется к целочисленному типу int32 с помощью int32().
- Так как результат
math.Pow()
не помещается в int32, происходит переполнение. int32 может хранить значения от-2147483648
до2147483647
. - При переполнении значение обрезается по модулю до разрядной сетки int32. В данном случае остается 0.
- Функция println выводит полученное значение 0.
- Так происходит из-за несоответствия типов данных и диапазонов значений.
- Нужно явно приводить к бОльшему целочисленному типу, например int64.
Ответ №2 (интерпретатор)
(*) В интерпретаторе: https://go.dev/play/p/wO02cFADV9M?v=goprev
Выдает: -2147483648
Задача 2.
Что выведет функция?
func subis(is []int) []int {
return append(is, 5)
}
func main() {
is := []int{1, 2, 3, 4}
subis(is[2:3])
fmt.Println(is)
}
Ответ №1 (нейросеть)
Пояснение:
- В функции main создается срез (slice) целых чисел
is := []int{1, 2, 3, 4}.
- Далее передается его подсрез
is[2:3]
, который содержит только число3
. - В функции subis к этому подсрезу добавляется число
5
. Но при этом исходный срез is не меняется. - Функция subis возвращает новый срез, содержащий 3 и 5. Но результат работы функции никуда не присваивается.
- Поэтому, когда мы выводим исходный срез is – он остается неизменным:
[1 2 3 4]
. - Вывод: в Go срезы (slices) передаются в функции по значению. Чтобы изменить исходный срез, нужно передавать указатель на него.
- В данном случае этого не происходит, поэтому is не меняется.
Ответ №2 (интерпретатор)
https://go.dev/play/p/oaZ4MevSrXZ
Ответ: [1 2 3 5]
Нет Ответов