Golang вопросы собеседований
13.5K subscribers
631 photos
3 videos
1 file
433 links
@notxxx1 - админ

@Golang_google - Golang для разработчиков

@itchannels_telegram - 🔥лучшие из ит

@golangl - chat

@golangtests - golang tests

@golang_jobsgo - go chat jobs

@ai_machinelearning_big_data - AI

@data_analysis_ml

РКН: clck.ru/3FmtKd
加入频道
👣 Отличный обучающий материал по Go

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

📎 Ссылка

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Golang
👣 Шпаргалка по Go

Мощная шпаргалка по Go, которая покрывает практически все темы
Если пролистать хотя бы по диагонали, есть отличный от нуля шанс пройти собеседование и получить оффер)

Что внутри?
├╼ Компилятор
├╼ Пакеты
├╼ Функции
├╼ Управление памятью
├╼ Операторы
├╼ Управляющие структуры
├╼ Объектноориентированность
├╼ Интерфейсы
├╼ Обработка ошибок
├╼ Горутины (Goroutine)
├╼ Проверка управления памятью
├╼ Reflect
├╼ Добавление кода C
├╼ GUI
╰╼ Распределенные системы

📎 Cheatsheet

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Собственная функция sleep

Итак, задача: написать свою фукнцию sleep
🟡Первое, что может прийти в голову — использовать time.After, вот так:
package main

import (
"log"
"time"
)

func sleep(d time.Duration) {
select {
case <-time.After(d):
}
}

func CallSleep() {
log.Println("Do something")
sleep(5 * time.Second)
log.Println("Something else")
}

Но выглядит как-то громоздко, да и вообще.

🟡Второй вариант — сделать так:
func sleep2(d time.Duration) time.Time {
ticker := time.Tick(d)
for done := range ticker {
return done
}
return time.Now()
}


🟡А можно вообще сделать так:
func sleep(d time.Duration) {
<-time.After(d)
}

Ну вот, то, что нужно

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Golang HTTP синхронизация

▶️Кейс: пишем Restful сервер с использованием патернов network_api -> data(UseCase->Repository).

Так как все http хендлеры обрабатываются параллельно, то каким образом корректно протянуть зависимости репозиториев и use_case объектов в слой network_api? То есть это будут синглтоны или же их нужно создавать для каждого отдельного request?
Что насчёт доступа к общим ресурсам?
Например, use_case при загрузке читает json-конфигурацию и в дальнейшем к ней обращается по многим путям из слоя nwtwork_api.

Есть какие нибудь best practices?


▶️Здесь всё зависит от того, какие требования предъявляются к нашим данным (т.е именно модель данных диктует требования к архитектуре).
Если наши данные терпимы к параллельному одновременному доступу — тогда можно не замарачиваться. Если же нельзя одновременно из нескольких потоков обращаться к менеджеру данных — тогда стоит ввести глобальную блокировку. Фактически, такой глобальной блокировкой будет являться единственное соединение к базе данных.
Вот и всё, пожалуй

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Go, Allure и HTTP, или как тестировать HTTP-сервисы на Go

Держите полезную статью о тестировании Go-приложений
Что внутри?

В статье рассматривается создание библиотеки CUTE для упрощения тестирования HTTP-сервисов на языке Go.

Библиотека CUTE облегчает создание автотестов и упрощает переход на Go, предоставляя возможности для создания HTTP-тестов и реализации проверок.

Ранее в компании Ozon не было подходящих инструментов для тестирования HTTP-сервисов, и библиотека CUTE была создана для решения этой проблемы.

В статье описывается процесс создания теста, начиная с подготовки сервиса и инициализации билдера.

Библиотека предоставляет возможности для информирования о тесте, подготовки дополнительных шагов и создания запросов.

В библиотеке доступны готовые ассерты для проверки кода ответа, JSON-схем и полной проверки ответа.

Тестировщики могут создавать свои собственные ассерты, используя функции для реализации различных типов проверок.

Для создания теста необходимо вызвать ExecuteTest, передавая контекст и testing.TB или provider.T

📎 Статья

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 5 неожиданных вопросов с собеседований по Go

Многие собеседования традиционно включают в себя оторванные от практики вопросы, которые могут поставить в ступор даже сеньера.
Но если ты посмотришь это видео, то будешь знать ответы, и во всеоружии встретишь такие вопросы, если они попадутся
Уверен, будет полезно)

📎 YouTube

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Как проверить, имплементирует ли переменная интерфейс?

В Go, реализация интерфейса является неявной, поэтому используется конструкция вида
var _ myInterface = &myImplementation{}:
type T struct{}
var _ I = T{} // Проверка, что T имплеменирует I.
var _ I = (*T)(nil) // Проверка, что *T имплеменирует I.


Обычно это указывают, чтобы ошибки были выявлены уже во время компиляции.

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Подборка вопросов для собеседования и немного теории

Держите годный контент)
Тут неплохой список тем, которые с большой вероятностью будут обсуждаться на собеседовании + теория по самому важному

Собственно, теория покрывает такие разделы:

🟡Типы данных
├╼ Скалярные
├╼ Массив и слайс
├╼ Map
├╼ Структура
╰╼ Интерфейс
🟡Сoncurrency
├╼ Каналы
├╼ Горутины
├╼ Sync
╰╼ Паттерны
🟡Планировщик
🟡Управление памятью
🟡Экосистема

Уверен, будет полезно) Успешных собеседований
📎 Вопросы и немного теории

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Подборка популярных вопросов с собеседований на позицию Go-разработчика

Держите репозиторий с вопросами по Golang. Здесь вы найдете вопросы, которые могут быть заданы на собеседовании, с подробными разъяснениями и анализом различных corner cases. Представьте, что это ваши билеты на экзамен - вытягивайте билет и готовьтесь!

Здесь затрагиваются самые важные темы Go, в том числе:
• Slices
• Maps
• Указатели
• Goroutines и Channels
• Работа со строками

🖥 Подборка

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Использование io.Pipe в Golang

▶️Вот пример использования io.Pipe для создания туннеля между писателем и читателем.
// отправляем пользователю ответ с аттачем
//reader, writer := io.Pipe()
writer := new(bytes.Buffer)
err = main.Doc.Save(writer) // метод Документа из unioffice - принимает io.Writer, сохраняет тип Document в zip.
//writer.Close() // для Pipe
...
reader := bytes.NewReader(writer.Bytes())
...
nbytes, err := io.Copy(w, reader) // w это http.ResponseWriter

При запуске эта программа зависает, поэтому приходится использовать промежуточный буфер, как видно из кода. Что здесь не так с использованием Pipe?


▶️Проблема здесь довольно проста, вы же заметили?
Нужно просто вызов Writer обернуть в горутину, иначе все блокируется.
go func () {
defer writer.Close()
err = main.Doc.Save(writer) // принимает io.Writer
...
}
}()

Вот и всё

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Количество дней между двумя датами в Go

Ну тут всё просто, чтобы вычислить количество дней между 2 датами можно использовать функцию Sub из пакета time.
func main() {
// В високосном году 2096 будет 366 дней
t1 := Date(2096, 1, 1)
t2 := Date(2097, 1, 1)
days := t2.Sub(t1).Hours() / 24
fmt.Println(days) // 366
}

func Date(year, month, day int) time.Time {
return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC)
}


@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Почему теряются поля при конвертации?

▶️Итак, есть такая структура ответа map:
map[
/dbus-service:map[
org.freedesktop.DBus.Introspectable:map[]
org.freedesktop.DBus.Peer:map[]
org.freedesktop.DBus.Properties:map[]
Basket:map[
Fruit:"Apple"
]
]


При конвертации в json значение поле Fruit "теряется":
"/dbus-service":{
"org.freedesktop.DBus.Introspectable":{},
"org.freedesktop.DBus.Peer":{},
"org.freedesktop.DBus.Properties":{},
"Basket":
{
"Fruit":{}
}
}


Для вывода используется это:
fmt.Printf("%v", data)

jsonData, _ := json.Marshal(data)
fmt.Printf("json data: %s", jsonData)


Вопрос на засыпку: почему так происходит с Fruit?


▶️Ответ: этой ситуации данные не пропадают. Они не Marshal'aлятся у Fruit:"Apple".
"Apple" — имеет тип данных dbus.Variant
У него нету "публичных" свойств. Неэкспортируемых.

Экспортируемые пишутся с большой буквы.
Неэкспортируемые с маленькой.

Решение: создавать новое дерево map'ов с примитивными данными (string вместо dbus.Variant) путем рекурсии.

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM