Библиотека Go для собеса | вопросы с собеседований
6.88K subscribers
224 photos
7 videos
1 file
434 links
Вопросы с собеседований по Go и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/0b524a15

Для обратной связи: @proglibrary_feeedback_bot

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
👀Что из этого сгенерировала нейросеть?

Подписывайтесь на наш новый канал про нейросети для создания изображений, там есть:

🌸Новые нейросети и инструменты, например, вот модель генерирует картинки по наброску
🌸Промты для разных задач
🌸Лайфхаки по использованию нейросетей

👉Подписывайтесь!
Please open Telegram to view this post
VIEW IN TELEGRAM
Самые полезные каналы для программистов в одной подборке!

Сохраняйте себе, чтобы не потерять 💾

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы

🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion

#️⃣C#

Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel

☁️DevOps

Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования

🐘PHP

Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты

🐍Python

Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты

Java

Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков

👾Data Science

Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту

🦫Go

Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go

🧠C++

Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++

💻Другие каналы

Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности

📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈

Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT

Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *

* Организация Meta запрещена на территории РФ
👍1
💬 Как реализовать rate limiter на Go?

Rate limiter — это механизм для контроля частоты доступа к определенному ресурсу. В Go для его реализации можно использовать пакет rate из стандартной библиотеки.

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

Пакет rate предоставляет функцию NewLimiter(), которую можно использовать для создания нового token bucket rate limiter. Например:


limiter := rate.NewLimiter(rate.Limit(100), 100)


Затем можно использовать метод limiter.Allow(), чтобы проверить, доступен ли токен перед выполнением задачи:


if limiter.Allow() {
// выполнение задачи
} else {
// превышен лимит скорости
}


В качестве альтернативы можно использовать метод limiter.Wait(), чтобы подождать, пока токен станет доступен:


limiter.Wait()
// выполнение задачи


Также можно использовать метод limiter.Reserve(), чтобы зарезервировать токен заранее и выполнить задачу позже.
🔥14👍4
Proglib запускает канал Азбука айтишника

Подписывайтесь на наш новый канал про айти для неайтишников — для совсем новичков и тех, кто постоянно взаимодействует с айтишниками.

У нас есть рубрики:
База — в ней рассказываем про термины из IT простым языком
Проект — объясняем, из чего состоят айтишные проекты и сколько они могут стоить
Психология айтишника — тут говорим про софт-скиллы, особенности работы и взаимодействия

👉Подписывайтесь!
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Как реализовать reverse proxy на Go?

Reverse proxy — это механизм для перенаправления входящих запросов на другой сервер или сервис. Для реализации на Go можно использовать пакет httputil:


package main

import (
"net/http"
"net/http/httputil"
"net/url"
)

func main() {
targetServer := "example.com"
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: targetServer,
})

http.Handle("/", proxy)
http.ListenAndServe(":8000", nil)
}


В примере входящие запросы на обратный прокси на порту 8000 будут перенаправлены на целевой сервер example.com.

Мы также можем настроить поведение обратного прокси, реализовав функцию Director, которая может быть использована для изменения запроса перед его перенаправлением на целевой сервер.

📌 Пример настройки функции Director:


package main

import (
"net/http"
"net/http/httputil"
"net/url"
)

func main() {
targetServer := "example.com"
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: targetServer,
})

proxy.Director = func(req *http.Request) {
req.Header.Set("X-Forwarded-Host", req.Host)
req.Header.Set("X-Origin-Host", targetServer)
req.Host = targetServer
}

http.Handle("/", proxy)
http.ListenAndServe(":8000", nil)
}
👍151
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
💬 Что из себя представляют теги структур в Go?

Теги структур — это аннотации, которые отображаются после типа в объявлении структуры Go. Каждый тег состоит из коротких строк, которым назначены определенные значения.

Они не влияют на саму логику программы, но позволяют контролировать процесс сериализации и десериализации данных, валидацию и многое другое.

Пример использования:


type User struct {
Name string `json:"name"`
Age int `json:"age"`
}


В этом примере к полям структуры User добавлены теги json, которые указывают, как эти поля должны быть сериализованы в JSON. Тег json:"name" говорит, что поле Name должно быть представлено как "name" в JSON, аналогично для поля Age.

Для работы с этими тегами можно использовать пакет reflect. Например, чтобы получить значение тега json для поля Name, можно использовать:


package main

import (
"fmt"
"reflect"
)

type User struct {
Name string `json:"name"`
Age int `json:"age"`
}

func main() {
p := User{Name: "John Doe", Age: 30}
t := reflect.TypeOf(p)
field, ok := t.FieldByName("Name")
if ok {
fmt.Println(field.Tag.Get("json")) // Выведет: name
}
}
👍22
💬 Как создать кэш на Go?

Кэш — это инструмент, который сохраняет данные в памяти, чтобы их можно было быстро получить позже. На Go можно создать кэш с использованием пакета sync или сторонних библиотек вроде go-cache:


package main

import (
"fmt"
"sync"
)

func main() {
// создаем новый кэш
cache := &sync.Map{}

// добавляем пару ключ-значение в кэш
cache.Store("key", "value")

// извлекаем значение из кэша
value, ok := cache.Load("key")
if ok {
fmt.Println(value) // Output: value
}

// удаляем ключ из кэша
cache.Delete("key")

// проверяем, существует ли ключ в кэше
_, ok = cache.Load("key")
fmt.Println(ok) // Output: false
}


В примере мы создаем новую структуру sync.Map и используем функции Store(), Load(), Delete() для добавления, извлечения и удаления пар ключ-значение из кэша соответственно.
🥱15😢3👍1
💬 Что происходит при запуске программы на Go? Например, если пакет main импортирует пакет A, а пакет A зависит от пакета B.

🔸 Процесс начинается с пакета main
🔸 Пакет main импортирует пакет A
🔸 Пакет A импортирует пакет B
🔸 Инициализируются глобальные переменные (если таковые имеются) в пакете B
🔸 Выполняется функция init() или функции пакета B, если они существуют. Это первая функция init(), которая выполняется
🔸 Глобальные переменные, если таковые имеются, в пакете A инициализируются
🔸 Выполняется функция init() или функции пакета A, если таковые имеются
🔸 Инициализируются глобальные переменные в пакете main
🔸 Выполняется функция init() или функции пакета main, если они есть
🔸 Функция main() пакета main начинает выполнение

📌 Если пакет main импортирует пакет B самостоятельно, то ничего не произойдет, поскольку все, что связано с пакетом B, запускается пакетом A. Так происходит потому, что пакет A сначала импортирует пакет B.
👍24🥱6🔥1
Ответьте на 3 вопроса, чтобы получить вводные занятия к курсу «Алгоритмы и структуры данных»

🔥Получите вводные занятия, ответив на 3 вопроса – https://proglib.io/w/c2161ff4

На вводной части вас ждут:

1. Лекция «Производительность алгоритмов» от руководителя разработки Яндекс.Самокатов

2. Лекция «Итеративные сортировки и линейные сортировки» от аспирант департамента искусственного интеллекта ВШЭ

3. Практические задания после лекций

4. Ссылки на дополнительные материалы для самостоятельного изучения

⚡️Переходите и начинайте учиться уже сегодня – https://proglib.io/w/c2161ff4
Please open Telegram to view this post
VIEW IN TELEGRAM
#️⃣🔢 Логические и математические задачи с собеседований

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

🔗 Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2
💬 Как устроено фаззинг-тестирование в Go?

Фаззинг представляет собою технологию автоматизированного поиска ошибок с помощью случайных входных данных и анализа реакции программы на них. Она полезна, если нужно проверить граничные условия или корректность обработки потока ввода — то есть тогда, когда нужно найти значения, при которых «падает» программа. В Go 1.18 была введена встроенная поддержка фаззинг-тестирования.

📌 Основные правила для фаззинг-тестов в Go:

1. Название метода должно начинаться с FuzzXxx, принимать только *testing.F в качестве аргумента и не возвращать значение.
2. Название файла с фаззинг-тестами: *_test.go.
3. Фаззинг target должна быть вызовом метода (*testing.F).Fuzz, который принимает *testing.T в качестве первого параметра, за которым следуют аргументы для фаззинга (не возвращает значение).
4. В одном фаззинг-тесте должна быть ровно одна фаззинг target.
5. Все элементы seed corpus должны иметь типы, идентичные аргументам для фаззинга, в том же порядке. Это касается вызовов (*testing.F).Add и любых файлов corpus в директории testdata/fuzz.
6. Аргументы для фаззинга могут быть только следующих типов:
- string, []byte
- int, int8, int16, int32/rune, int64
- uint, uint8/byte, uint16, uint32, uint64
- float32, float64
- bool
👍5
💬 Как реализовать CQRS и Event Sourcing на Go?

CQRS — это паттерн, который разделяет ответственность за чтение и запись данных. Это позволяет разным частям системы обрабатывать различные задачи, например, использовать разные базы данных для чтения и записи или использовать разные модели данных для чтения и записи.

Event Sourcing — это паттерн, который включает в себя хранение всех изменений состояния системы в виде последовательности событий. Это позволяет восстанавливать состояние системы в любой момент времени путем воспроизведения событий.

📌 Простой пример реализации с использованием библиотеки eventstore представлен выше.

👉 Знакомство с CQRS путем рефакторинга Go-проекта
👉 Реализация на чистом Go
🔥5👍21
⚡️ Паттерн Transactional Outbox: теория и практика от Николая Тузова

Таймкоды:

00:00 Какую проблему мы решаем
05:47 Нам нужна атомарность
07:03 Про Two-Phase Commit
07:36 NoSQL базы данных
09:59 Гарантия доставки - "At Least Once"
11:48 Практика: пишем Outbox для сокращателя ссылок
12:43 Storage: сохраняем сообщения в таблицу
28:01 Event Sender: отправка сообщений из таблицы
36:52 Подключаем Event Sender
39:09 Тестируем отправку сообщений
41:12 Итоги

📺 Смотреть полностью
👍141
💬 Чем observability (наблюдаемость) отличается от «традиционного» мониторинга?

Мониторинг фокусируется на вопросах, ответы на которые помогут определить или предсказать некоторые ожидаемые или ранее имевшие место режимы отказа. Проще говоря, мониторинг сосредоточен на «известных неизвестных».

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

Мониторинг — это наши действия в системе, которые предпринимаются с целью узнать, работает она или не работает. Методы observability, напротив, основной упор делают на понимание системы, позволяющее соотносить события и поведение. Observability — это свойство системы, которое позволяет спросить, почему она не работает.

Три столпа observability — это собирательное название, под которым иногда упоминаются три наиболее распространенных (и основополагающих) инструмента — логирование, метрики и трассировка.
👍7🥱2
💬 Какие особенности необходимо учитывать при работе с функциями context.WithValue и context.Value?

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

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

👉 Подробнее
💬 Какие существуют распространенные реализации шаблона запрос/ответ?

🔸 REST — это архитектурный стиль для создания сетевых приложений, основанный на принципах HTTP. Он предполагает использование стандартных HTTP-методов (GET, POST, PUT, DELETE и т. д.) для выполнения операций над ресурсами, идентифицируемыми с помощью URL.
🔸 Вызов удаленных процедур (Remote Procedure Calls, RPC). RPC-фреймворки позволяют программам запускать процедуры в другом адресном пространстве (на удалённых узлах, либо в независимой сторонней системе на том же узле). В Go имеется стандартная реализация RPC в форме пакета net/rpc. Есть также две крупные реализации RPC, поддерживающие разные языки программирования: Apache Thrift и gRPC. Несмотря на сходство целей и архитектуры, gRPC, пользуется большей популярностью в сообществе.
🔸 GraphQL — язык запросов и управляющих воздействий, который часто считают альтернативой REST. Он особенно эффективен при работе со сложными наборами данных.

👉 А ваша служба является RESTful? Все что необходимо/обязательно знать про веб службы и REST (читать)
👍32
💬 Как создать альтернативу bytes.Buffer, которая реализует интерфейс io.ReadWriter, позволяет узнать длину и емкость буфера и занимает меньше памяти, чем bytes.Buffer?

Для этой задачи можно использовать новый тип, основанный на срезе байт. Вот пример реализации:


// Buffer — буфер байтов переменного размера с методами Read и Write
// Нулевое значение Buffer — пустой буфер, готовый к использованию
type Buffer []byte

// Write записывает len(p) байт из p в Buffer
func (b *Buffer) Write(p []byte) (int, error) {
*b = append(*b, p...)
return len(p), nil
}

// Read читает до len(p) байт в p из Buffer
func (b *Buffer) Read(p []byte) (int, error) {
if len(p) == 0 {
return 0, nil
}
if len(*b) == 0 {
return 0, io.EOF
}
n := copy(p, *b)
*b = (*b)[n:]
return n, nil
}


В примере создается тип Buffer, который является срезом байт (`[]byte`). Методы Write и Read реализованы для добавления данных в буфер и чтения данных из буфера соответственно.

👉 Другое решение можно найти здесь
👍31🔥1
💬 Как Go обновляет сторонние пакеты?

В Go для управления сторонними пакетами используется инструмент go get или модули Go. В более ранних версиях Go до введения модулей, для установки и обновления сторонних пакетов использовалась команда go get. Она скачивала и устанавливала пакеты из удаленного репозитория в $GOPATH.

С появлением модулей Go (Go 1.11+), использование go get для управления зависимостями стало менее распространенным. Вместо этого, мы можем создать и поддерживать файл go.mod, который описывает зависимости проекта.

Для обновления зависимостей в проекте с модулями Go используется команда go get -u или go get -u=patch для обновления до последней минорной версии или патча соответственно. Это обновление происходит в контексте модульной структуры проекта и сохраняет совместимость версий зависимостей.

По умолчанию Go добавляет последнюю доступную версию пакета. Чтобы проверить, какие еще версии пакета доступны, используется команда go list. По умолчанию она выдает адрес текущего пакета, по которому его можно импортировать.

Чтобы изменить версию конкретного пакета до версии vX.X.X, используется следующая команда:


go get github.com/example/repo@vX.X.X


Обновляем указанные зависимости:


go get -u <package-name>
👍9