Библиотека Go для собеса | вопросы с собеседований
6.87K subscribers
218 photos
6 videos
1 file
415 links
Вопросы с собеседований по Go и ответы на них.

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
💬 Какие существуют распространенные реализации шаблона запрос/ответ?

🔸 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
💬 В чем суть протокола веб-сокет и в чем преимущество Go при работе с веб-сокетами?

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

Горутины в Go более эффективны по сравнению с традиционными потоками операционной системы благодаря меньшему потреблению памяти и более низким накладным расходам на создание и управление ими.

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

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

Это делает Go идеальным выбором для реализации веб-сокет серверов, где требуется эффективная обработка и обмен сообщениями между клиентом и сервером в реальном времени.
👍8🥱2
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
👍1
💬 Как в Go вернуть из функции ошибку, не импортируя дополнительных пакетов, даже стандартных?

📌 Простой пример:


package main

// CustomError определяет структуру для ошибки
type CustomError struct {
message string
}

// Error реализует интерфейс error для CustomError
func (e *CustomError) Error() string {
return e.message
}

// Функция, которая может вернуть ошибку
func divide(a, b float64) (float64, *CustomError) {
if b == 0 {
// Создание и возврат ошибки
return 0, &CustomError{message: "division by zero"}
}
return a / b, nil
}

func main() {
result, err := divide(4, 0)
if err != nil {
// Обработка ошибки
println("Error:", err.Error())
} else {
println("Result:", result)
}
}


🔷 Структура CustomError содержит одно поле message типа string, которое будет хранить сообщение об ошибке.
🔷 Метод Error возвращает сообщение об ошибке. Это позволяет CustomError удовлетворять интерфейсу error.
🔷 Функция принимает два параметра типа float64 и возвращает два значения: результат типа float64 и ошибку типа *CustomError.
🔷 Если второй аргумент b равен нулю, создается и возвращается ошибка с помощью CustomError.
🔷 Результат и ошибка, возвращаемые функцией, проверяются. Если ошибка существует, она обрабатывается (в данном случае выводится на экран с помощью println). Если ошибки нет, выводится результат деления.
👍11🥱7😁2💯1
💬 Для чего предназначена функция os.Exit?

Она предназначена для немедленного завершения программы с заданным статусом. Функция завершает выполнение текущего процесса без выполнения отложенных функций (defer).

Go не использует целочисленное значение возврата из функции main для указания статуса выхода. Если нужно завершить программу с ненулевым статусом, следует использовать os.Exit.
👍1
💬 Что из себя представляет тип данных string в языке Go? Можно ли изменить определенный символ в строке? Что происходит при конкатенации строк?

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

При конкатенации строк создается новая строка, которая является комбинацией исходных строк. Это требует выделения нового блока памяти требуемого размера.

Чтобы избавиться от лишних аллокаций, можно воспользоваться типом strings.Builder и методом WriteString:

func join(strs ...string) string {
var sb strings.Builder
for _, str := range strs {
sb.WriteString(str)
}
return sb.String()
}
👍111
🏃 Самоучитель по Go для начинающих. Часть 13. Работа с датой и временем. Пакет time

В этой части самоучителя изучим способы работы с датами и временем в языке Go, разберем полезные функции пакета time и в заключение решим парочку интересных задач.

👉 Читать гайд

📌 Остальные части в серии:

1. Особенности и сфера применения Go, установка, настройка
2. Ресурсы для изучения Go с нуля
3. Организация кода. Пакеты, импорты, модули. Ввод-вывод текста.
4. Переменные. Типы данных и их преобразования. Основные операторы
5. Условные конструкции if-else и switch-case. Цикл for. Вложенные и бесконечные циклы
6. Функции и аргументы. Области видимости. Рекурсия. Defer
7. Массивы и слайсы. Append и сopy. Пакет slices
8. Строки, руны, байты. Пакет strings. Хеш-таблица (map)
9. Структуры и методы. Интерфейсы. Указатели. Основы ООП
10. Введение в ООП. Наследование, абстракция, полиморфизм, инкапсуляция
11. Обработка ошибок. Паника. Восстановление. Логирование
12. Обобщенное программирование. Дженерики
❗️Вакансии «Библиотеки программиста» — ждем вас в команде!

Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉авторов в наше медиа proglib.io
👉контент-менеджеров для ведения телеграм-каналов

Подробности тут.

Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴

Ждем ваших откликов 👾
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Можно ли предугадать, что GC отработает за константное время N?

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

Сборщик мусора работает по алгоритмам, которые могут варьироваться по времени выполнения в зависимости от конкретных условий.
👍11
💬 Какие особенности следует учитывать при сбросе таймеров в Go разных версий?

Go ≤ 1.22: для таймера, созданного с помощью NewTimer, метод Reset следует вызывать только на остановленных или завершенных таймерах с drained каналами.

Go ≥ 1.23: для таймера, созданного с помощью NewTimer, безопасно вызывать метод Reset на таймерах в любом состоянии (активном, остановленном или завершенном). Очистка канала не требуется, так как канал таймера больше не буферизован (в некотором роде).

Для таймера, созданного с помощью AfterFunc, метод Reset либо переназначает выполнение функции (если таймер все еще активен), либо планирует выполнение функции заново (если таймер остановлен или завершен).

👉 Подробнее
👍12
💬 Как в Go передаются значения в функции, перед которыми указано defer?

В Go функции, перед которыми указано defer, откладываются до тех пор, пока не завершится текущий блок кода или текущая функция, в которой был вызван defer.

Аргументы для таких функций вычисляются немедленно, но сама функция выполняется позже, когда сработает отложенное действие. Это значит, что все значения аргументов, переданных в defer функцию, фиксируются в момент объявления defer.

Рассмотрим на примере:
package main

import "fmt"

func main() {
x := 10
defer fmt.Println("deferred:", x) // Аргумент x вычисляется сейчас, но вывод откладывается
x = 20
fmt.Println("immediate:", x)
}

В этом коде, хотя x изменяется после объявления defer, отложенная функция fmt.Println получит значение x, которое было в момент объявления defer, то есть 10. Поэтому вывод будет следующим:

immediate: 20
deferred: 10
👍36
💬 Что из себя представляет концепция channels of channels?

Это концепция в Go, которая предусматривает использование каналов для передачи других каналов.

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

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

📌 Разберем на примере:


package main

import (
"fmt"
)

func main() {
// Создаём канал, который будет передавать каналы
ch := make(chan chan int)

// Горутина, которая получает канал из ch и отправляет данные через него
go func() {
newCh := <-ch
newCh <- 42
}()

// Создаём новый канал для передачи данных
newCh := make(chan int)

// Отправляем новый канал через ch
ch <- newCh

// Получаем данные из newCh
fmt.Println(<-newCh) // Вывод: 42
}


👉 Подробнее
👍11🔥2
🚀 Выжимаем из Go максимум производительности: по мотивам доклада на Saint HighLoad++

Никита Галушко, старший разработчик в отделе высоконагруженных систем и оптимизации ВКонтакте, делится хитростями повышения производительности Go.

📌 Вы узнаете:

• про память, а именно про small-size объекты и интерфейс;
• как сильно может влиять на производительность BCE (Bounds Check Elimination) и почему не все циклы for-loop одинаково полезны;
• про особенности, которые текущий компилятор Go накладывает на код;
• про оптимальную конвертацию string -> []byte и []byte -> string, конкатенацию и связанные с ней оптимизации.

👉 Читать статю
👍7
💬 Что такое рекурсия и для каких целей она может использоваться?

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

Распространенный пример — вычисление факториала положительного целого числа, то есть произведения всех положительных целых чисел, меньших или равных n:


package main

import "fmt"

func factorial(n int) int {
if n < 1 {
return 1
}
return n * factorial(n-1)
}

func main() {
fmt.Println(factorial(11)) // 39916800
}


Выделяют три вида рекурсии:

🔸 Прямая: функция вызывает саму себя.
🔸 Косвенная: цепочка вызовов включает более одной функции.
🔸 Хвостовая: рекурсивный вызов стоит последней операцией в функции.

Рекурсия широко используется в программировании для решения целого ряда задач:

🔸 Математические расчеты, в которых следующее значение получается на основе предыдущего.
🔸 Реализация алгоритмов и структур данных.
🔸 Разбиение сложных задач на простые.
🥱8👍1
Самые полезные каналы для программистов в одной подборке!

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

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
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++

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

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

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

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

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

* Организация Meta запрещена на территории РФ
👍1
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

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

Netpoller — это механизм, встроенный в рантайм Go, который занимается мониторингом сетевых сокетов для I/O операций, используя модели мультиплексирования событий, такие как epoll на Linux, kqueue на BSD системах и macOS, и IOCP на Windows.

Основная задача netpoller заключается в отслеживании событий ввода-вывода на сетевых сокетах (готовность чтения или записи данных). Это позволяет рантайму Go эффективно обрабатывать множество сетевых соединений одновременно, используя минимальное количество потоков.

Когда Go-программа выполняет сетевую операцию, она регистрирует соответствующий сокет в netpoller.
🔸 Netpoller отслеживает эти сокеты и уведомляет Go рантайм, когда один из них готов для выполнения I/O операции.
🔸 Это уведомление передается планировщику Go, который назначает выполнение соответствующей горутины, связанной с этим сокетом.
👍133🔥2
💬 Что из себя представляют методы в Go?

Методы в Go — это функции, прикрепленные к типам, включая структуры. Синтаксис объявления метода похож на синтаксис объявления функции, за исключением дополнительного аргумента ресивера перед именем функции, указывающего на тип, к которому прикрепляется метод. В вызове метода экземпляр типа будет доступен по имени аргумента ресивера.

Возьмем для примера тип Vertex и добавим к нему метод Square, указав ресивер с именем v и типом *Vertex:


package main

import "fmt"

type Vertex struct {
X, Y int
}

func (v *Vertex) Square() { метод к типу *Vertex
v.X *= v.X
v.Y *= v.Y
}

func main() {
vert := &Vertex{3, 4}
fmt.Println(vert) // &{3 4}
vert.Square()
fmt.Println(vert) // &{9 16}
}


Метод Square изменяет значения полей X и Y структуры Vertex на их квадраты. Вызов vert.Square() изменяет vert на &{9 16}.

Помимо структур можно также создавать свои версии стандартных составных типов — структур, срезов или ассоциативных массивов — и присоединять к ним свои методы. Например, объявим новый тип MyMap, версию стандартного ассоциативного массива map[string]int, и присоединим к нему метод Length:


package main

import "fmt"

type MyMap map[string]int

func (m MyMap) Length() int {
return len(m)
}

func main() {
mm := MyMap{"A": 1, "B": 2}
fmt.Println(mm) // map[A:1 B:2]
fmt.Println(mm["A"]) // 1
fmt.Println(mm.Length()) // 2
}


Результатом является новый тип MyMap, отображающий строки в целые числа подобно map[string]int, но имеющий дополнительный метод Length, который возвращает количество элементов в массиве.
👍16🥱71