Ниже – разбор вопросов/задачек с интервью на позицию “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]

Tags

Нет комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Рубрики


Подпишись на новости
👋

Есть вопросы?