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

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
👨🏻‍💻 Реальный вопрос от реального человека

Есть табличное тестирование функции (делал на основании туториалов с официального сайта go). Примечание: Go недавно щупаю.

Условный код:

func TestMyFunc(t *testing.T) {
testTable := []struct {
name string
input string
want error
}{
{"find_expect_nil", "data", nil},
{"not_find_expect_err", "otherdata", ErrNoData},
}

for _, test := range testTable {
test := test
t.Run(test.name, func(t *testing.T) {
t.Parallel()
err := MyFunc(test.input)

if !errors.Is(err, test.want) {
t.Errorf("input value %s, result: %s, expected: %s", test.input, err, test.want)
}
})
}
}
Так вот, у меня в массиве структур порядка 30 позиций для теста, но почему-то возникает ситуация, когда я нажимаю пройти тесты в vscode, некоторые тесты кидают в result просто что-то случайное. Например ожидается какая-то ошибка, но приходит nil, или наоборот, ожидается nil, но приходит ошибка, и третий вариант, ожидается одна ошибка, но приходит совершенна другая(!). При этом корректность функции проверена и точно должна выдавать нужный результат.

Если прожать кнопку тестирования несколько раз, то со второго-третьего раза тесты все проходят успешно и больше ошибок не возникает, пока не изменить код. Сначала я думал что дело в vscode, но go test даёт тот же самый эффект.

Пробовал ставить t.Parallel() в главную функцию, не помогает. Есть объяснение что за чародейство и какое решение может быть?

Golang задачи с собеседований
👨🏻‍💻 Реальный вопрос от реального человека

docker-compose при сборке выдает следующую ошибку:

 => CANCELED [5/5] RUN go build -o consumer-app ./cmd/consumer/main.go                                                                                                                                    16.7s
failed to solve: executor failed running [/bin/sh -c go build -o producer-app ./cmd/producer/main.go]: exit code: 1

Задача запустить два мейника в отдельных контейнерах, но использовать одную и ту же папку для сборки образов.

Мейники лежат по следующей структуре:

cmd/producer/main.go

cmd/consumer/main.go

Два Dockerfile:

docker/consumer/Dockerfile

docker/producer/Dockerfile

Dockerfile consumer:

FROM golang:1.20

RUN go version
ENV GOPATH=/

COPY ./ ./
RUN go mod download
RUN go build -o consumer-app ./cmd/consumer/main.go
CMD ["./consumer-app/cmd/consumer"]

Dockerfile producer:

FROM golang:1.20

RUN go version
ENV GOPATH=/

COPY ./ ./
RUN go mod download
RUN go build -o producer-app ./cmd/producer/main.go
CMD ["./producer-app/cmd/producer"]

В docker compose опущу данные кафки и кипера), опишу что касается двух сервисов. docker-compose:

consumer:
build:
context: .
dockerfile: './docker/consumer/Dockerfile'
container_name: "consumer"
ports:
- "8081:8081"
depends_on:
- broker
producer:
build:
context: .
dockerfile: './docker/producer/Dockerfile'
container_name: "producer"
ports:
- "8080:8080"
depends_on:
- broker

Подскажите, что я делаю не так??

Golang задачи с собеседований
👨🏻‍💻 Реальный вопрос от реального человека

Рефлексия и обработка всех структур определенного типа

Пытаюсь реализовать пост-процессинг в проекте, и перед сериализацией в JSON сделать обработку структуры (для ответов API используются разные структуры) с целью конверсии валюты в заданную.

Имеется:

Структура, содержащая цену с валютой

 type Price struct {
Amount decimal.Decimal `json:"Amount"`
Currency string `json:"Currency`"
}

Структура ответа #1:

type ExampleRS struct {
Total price.Price `json:"Total"`
}

Дополнительная структура для ответа #2

type ResponseEntry struct {
ExampleIntValue int `json:"ExampleValue"`
ExampleStringArrayValues []string `json:"ExampleStringArrayValues"`
Price price.Price `json:"Price"`
}

Структура ответа #2

type ExampleListRS struct {
Data []ResponseEntry `json:"Response"`
PerPage uint `json:"Count"`
Pages uint `json:"Pages"`
}

Вопрос - как реализовать метод, принимающий на вход interface{}, или reflect.ValueOf вместо конкретного типа (ExampleListRS или ExampleRS), который будет рекурсивно проходить по структуре, делая проверку на price.Price, и умножающий в ней decimal.Decimal скажем, на 5?

Golang задачи с собеседований
👨🏻‍💻 Реальный вопрос от реального человека

Не работает маршрутизация изображений golang gin

У меня есть загрузка статических файлов на golang, фреймворк Gin.

func main() {
// Установка роутера Gin
router := gin.Default()

router.Static("/css", "./css")

В html такие пути

<img src= "/css/img/logo3.png">

а в самой директории проекта есть папка css, в ней папка img и там изображения.

Но почему-то при запуске всё равно выдаёт 404

Golang задачи с собеседований
В Ozon на Go — 1000+ микросервисов, обеспечивающих работу сайта, склада, логистики, а ещё технологическая платформа и сервисы инфраструктуры.
Звучит интересно? Тогда го в команду Ozon Tech.

Как всё будет?
Ozon приглашает вас на предварительное собеседование, а затем на ивент.
Там вы сможете пообщаться с тимлидами и послушать доклады экспертов.
One Day Offer закончится на афтерпати, а затем вы встретитесь снова уже в качестве коллег.

Если вам нравится этот план, кидайте заявку на странице мероприятия!
Когда приходится добавлять в стек новый язык, новую платформу, новый сервис или изобретать велосипед в пятнадцатый раз, начинаешь задумываться, как же этот процесс контролировать.

Как раз про это новый выпуск подкаста «Магнитное Поле» – здесь Владимир Дроздецкий, DevOps тимлид Магнита рассказывает про концепцию InnerSource, которая позволяет систематизировать процессы создания новых продуктов и сервисов внутри компании, чтобы не наступать на одни и те же грабли, не изобретать эти самые велосипеды и вообще автоматизировать процессы кикстарта разработки по максимуму.

Это уже шестой выпуск подкаста «Магнитное Поле», который совместно записывают Завтракаст и IT-команда ритейлера Магнит. В предыдущих выпусках обсуждали Data Governance, современные облачные решения и микросервисы, IT HR, ecom, кому нужен agile (а кому не нужен) и многое другое, так что стоит обратить внимание.

🎧 Послушать
📹 Посмотреть

Посмотреть вакансии и отправить резюме: https://magnit.tech
Please open Telegram to view this post
VIEW IN TELEGRAM
Уважаемые разработчики! 🖥 Сегодня я хочу поделиться с вами полезными советами от Сергея Наумкина, разработчика-лидера команды в Kaspersky.
Если ваша работа занимает слишком много времени, и вы хотите найти способы упростить и ускорить процесс разработки и тестирования приложений, то вам будет интересно узнать о преимуществах докеризации, которые он описывает в посте ниже😉

Кстати, там же вы сможете ознакомиться с вакансиями для Go-разработчиков в Kaspersky и применить свои навыки в команде профессионалов.
Forwarded from Kaspersky Team
Всё могут тимлиды! 🤴 Development Team Lead в Kaspersky Сергей Наумкин объясняет, что делать тем, у кого работа занимает слишком много времени.

Возможно, ты помнишь, что ещё пару лет назад для разработки и тестирования приложений нужно было ставить на свою или виртуальную машину СУБД, брокер сообщений и прочий софт.

Только всё это — вчерашний день. Теперь достаточно поставить себе docker и скачать контейнеры, чтобы быстро проверить концепт или начать разработку.

Занимаешься микросервисными приложениями? Ответ тот же — ставь docker. С ним будет в разы проще поднять инфраструктуру, а с docker-compose заниматься разработкой и тестированием в максимально реалистичной среде.

Несколько доводов в пользу докеризации приложения:
➡️ удобно передавать свой сервис в пользование команды;
➡️ проще поднять всю среду для разработки и тестирования;
➡️ легче воспроизводить разные сценарии;
➡️ нет зависимости от окружения рабочей станции;
➡️ бесплатная масштабируемость;
➡️ легковесность (в отличие от ВМ).

Docker-образы не должны пугать тебя размерами, ведь multi-stage сборки помогут держать в контейнере только необходимый сервис, а distroless сэкономит место.

Согласен с тем, что докеризация — классное решение? Любишь Go и хочешь работать с нами? Загляни по этой ссылке с вакансиями для Go-разработчиков.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥Рекомендуем провести вторую половину лета с пользой, изучив Android разработку .

Мы собрали сложный материал и объясняем его максимально просто в нашем телеграм канале бесплатно, без смс и регистраций.

Научись:
- дизайну и созданию приложений
- правильной архитектуре
- разработке игр
- методам заработка на приложениях

Освой одну из самых топовых профессий в мире разработчика приложений с нуля, путешествуй и зарабатывай из любой точки планеты.

Не плати за курсы, кла
Каким будет вывод кода ниже? основной пакет
импорт ("фмт")
константа A int = 1 func main () { fmt.Println(A) }
Anonymous Quiz
97%
1
2%
2
1%
4
0%
3
👨🏻‍💻 Реальный вопрос от реального человека

Не понимаю, почему нельзя так сделать... Подскажите, пожалуйста

validationErrors = validator.ValidationErrors{
&validator.FieldError{
FieldError: errors.FieldError{
Field: "Name",
Tag: "required",
Err: fmt.Errorf("Name is required"),
},
},
&validator.FieldError{
FieldError: errors.FieldError{
Field: "Age",
Tag: "gte",
Param: "18",
Err: fmt.Errorf("Age must be greater than or equal to 18"),
},
},
}

Golang задачи с собеседований