Библиотека Go для собеса | вопросы с собеседований
6.85K subscribers
221 photos
5 videos
1 file
405 links
Вопросы с собеседований по Go и ответы на них.

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Что представляет собой оператор select в Go и как он взаимодействует с каналами

Оператор select в Go напоминает конструкцию switch, но предназначен исключительно для работы с каналами. Он позволяет управлять несколькими каналами, одновременно ожидая данных или отправляя их.

➡️ Ключевые особенности select

• Ожидание нескольких каналов — select позволяет ожидать данные сразу из нескольких каналов или проверять возможность отправки данных в канал.

• Неблокирующий, если ни один канал не готов к операции, можно использовать default, чтобы избежать блокировки и продолжить выполнение программы.

• Рандомный выбор, если несколько каналов готовы к операции одновременно, select выберет один из них случайным образом.

Пример select
select {
case msg1 := <-ch1:
fmt.Println("Received", msg1)
case msg2 := <-ch2:
fmt.Println("Received", msg2)
case ch3 <- 3:
fmt.Println("Sent 3 to ch3")
default:
fmt.Println("No communication")
}

В этом примере select будет ждать, пока не получит сообщение из одного из каналов ch1 или ch2, или не сможет отправить значение в канал ch3. Если ни одно из этих условий не выполнится, будет выполнен блок default, который сообщает о том, что нет доступной коммуникации.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Тест для Golang-разработчиков, проверьте свои знания, готовы ли вы к обучению на курсе.

💻 Ответьте на 20 вопросов за 30 минут и проверьте, готовы ли вы к обучению на онлайн-курсе «Golang Developer. Professional» от OTUS. Сейчас Go становится все востребованнее, благодаря своей производительности, масштабируемости и экосистеме.

После 5 месяцев обучения вы сможете:
— Писать production-ready код, многопоточные и конкурентные программы.
— Понимать синтаксис и внутреннее устройство языка Go.
— Разворачивать микросервисы с помощью Docker.
— Проектировать и реализовывать микросервисную архитектуру на Go.

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

👉 ПРОЙТИ ТЕСТ

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Что такое указатели (pointers) в Go

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

Определение и инициализация
Указатель создается с помощью символа * перед типом. Например, var x *int объявляет указатель на переменную типа int.
Для получения адреса переменной используется оператор &. Например, &y вернет указатель на переменную y.

➡️ Dereferencing (разыменование)
Чтобы получить значение переменной, на которую ссылается указатель, используется снова символ *. Если x — это указатель на переменную y, то *x вернет значение переменной y.

➡️ Nil указатели
Указатель может быть nil, что означает, что он не указывает на какую-либо область памяти. Попытка разыменовать nil указатель приведет к ошибке во время выполнения.

➡️ Указатели в функциях
Все параметры в Go по умолчанию передаются по значению. Чтобы изменять значения переменных в функции, необходимо передавать указатели.

➡️ Указатели на структуры
В Go часто используют указатели на структуры для оптимизации и изменения данных без копирования. Для доступа к полям структуры через указатель можно использовать . (точку), например, pointerToStruct.FieldName, без необходимости разыменовывать указатель.

➡️ Осторожность с указателями
Неправильное использование указателей может привести к ошибкам, таким как разыменование nil указателя или возникновение «висячих» указателей.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41🥱1
Зачем и для чего нужен GOMAXPROCS в Go

GOMAXPROCS — это переменная окружения и функция в Go, которая ограничивает максимальное количество системных потоков, которые могут одновременно выполнять Go-код.

Как работает

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

Значение по умолчанию

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

Изменение GOMAXPROCS

Вы можете изменить это значение с помощью функции runtime.GOMAXPROCS(), чтобы настроить параллельное выполнение в зависимости от конкретных нужд приложения.

Как это влияет на производительность

Например, установка GOMAXPROCS в 1 ограничит выполнение всех горутин одним потоком, что полезно для отладки, но сильно ограничит производительность в многозадачных приложениях.

Инструмент от Uber — automaxprocs, который автоматически настраивает GOMAXPROCS в соответствии с квотой процессора в Linux-контейнерах.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
В каких случаях использовать указатели вместо копирования значений в Go

1️⃣ Работа с большими структурами или срезами
Передача указателей экономит память и улучшает производительность, избегая копирования больших объектов.

type LargeStruct struct {
Field1 [1000]int
Field2 [1000]int
}

func modify(s *LargeStruct) {
s.Field1[0] = 42
}

func main() {
ls := LargeStruct{}
modify(&ls) // Передаем указатель, избегая копирования
}


2️⃣ Изменение значений внутри функции
Для изменения значения переменной в функции и отражения этих изменений за пределами функции необходимо использовать указатель.

func increment(x *int) {
*x++
}

func main() {
num := 10
increment(&num) // Изменение переменной через указатель
fmt.Println(num) // 11
}


3️⃣ Работа с nil-значениями и создание пустых объектов
Указатели позволяют работать с
nil значениями, что полезно для создания пустых объектов или значений по умолчанию.
type User struct {
Name string
}

func createUser() *User {
return nil // Возвращаем nil, если пользователь не найден
}

func main() {
user := createUser()
if user == nil {
fmt.Println("User not found")
}
}


4️⃣ Управление памятью и взаимодействие с системными ресурсами
Указатели необходимы для работы с системными ресурсами или низкоуровневыми API, такими как через
cgo.
/*
#include <stdlib.h>

void modify(int *x) {
*x = 42;
}
*/
import "C"

func main() {
var num int
C.modify((*C.int)(&num)) // Используем указатель для передачи в C-функцию
fmt.Println(num) // 42
}


5️⃣ Ссылки на изменяемые данные в горутинах
Указатели удобны для совместного использования данных в горутинах, но требуют синхронизации для предотвращения гонок.

func incrementCounter(counter *int) {
*counter++
}

func main() {
counter := 0
go incrementCounter(&counter)
fmt.Println(counter) // Возможно увеличение
}


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Какие функции включены в стандартную библиотеку Go и как они упрощают разработку

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

➡️ Основные инструменты Go:

go fmt форматирует ваш код в соответствии с установленными стандартами Go. Это помогает поддерживать единый стиль в проекте, улучшая читаемость и уменьшая количество ошибок, связанных с форматированием.

go get автоматически загружает и устанавливает пакеты. Просто укажите нужный репозиторий, и go get позаботится о его клонировании, сборке и установке.

go test инструмент для запуска тестов. С его помощью можно легко проверить, что ваш код работает как ожидалось, и гарантировать его надежность.

go buildкомпилирует ваш исходный код и создает исполняемый файл. Это один из самых важных инструментов для перехода от кода к работающей программе.

go runпомогает быстро запустить программу Go без явной компиляции. Это удобный способ для быстрого прототипирования и тестирования кода.

go doc позволяет получить документацию для пакетов и функций прямо из командной строки, что экономит время на поиске и упрощает понимание API.

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

go mod управляет зависимостями в вашем проекте. Он упрощает работу с модулями и пакетами, позволяет обновлять их, следить за версиями и создавать чистую и стабильную среду для разработки.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
Какие способы ручного управления сборщиком мусора доступны в Go

В Go сборщик мусора (GC) автоматически управляет памятью, но бывают ситуации, когда нужно вмешаться и настроить его работу под свои нужды.

➡️ Управление сборщиком мусора

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

Отключение и включение GC
Можно временно отключить сборщик мусора, установив
debug.SetGCPercent(-1). Чтобы вернуть его в нормальный режим, используйте debug.SetGCPercent(100), где 100 — это значение по умолчанию.

➡️ Что такое GOGC

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

GOGC = 100 (значение по умолчанию) означает, что сборка мусора произойдет, когда объем выделенной памяти увеличится на 100% по сравнению с предыдущей сборкой.
GOGC = 50 ускоряет сборку мусора, позволяя ей запускаться чаще — после 50% увеличения памяти.
GOGC = -1 отключает сборщик мусора.


➡️ Настройка GOGC

Вы можете установить значение GOGC перед запуском программы через команду:
GOGC = 50 ./your-program

Или изменить его внутри программы с помощью
debug.SetGCPercent().

➡️ Влияние на производительность
Настройка частоты работы сборщика мусора напрямую влияет на производительность. Увеличение значения GOGC уменьшит частоту сборок мусора, но увеличит потребление памяти. Снижение GOGC заставит GC работать чаще, что может снизить потребление памяти, но повысит нагрузку на процессор.

Важно помнить: правильная настройка сборщика мусора может существенно повлиять на производительность вашего приложения. Иногда стоит поэкспериментировать с параметрами GOGC для достижения оптимального баланса между использованием памяти и процессорным временем.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64
Какие переменные окружения в Go наиболее важны

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

Ниже список наиболее часто используемых переменных окружения:

GOEXPERIMENTAL: Включает или отключает экспериментальные возможности компилятора.
GOARCH: Определяет архитектуру целевой системы (например, amd64, arm).
GOBIN: Указывает директорию, в которую будут установлены скомпилированные исполняемые файлы при использовании go install.
GOEXE: Устанавливает расширение для исполняемых файлов в зависимости от операционной системы.
GOFLAGS: Устанавливает флаги по умолчанию для всех команд Go.
GOOS: Определяет операционную систему для сборки (например, linux, darwin).
GOPATH: Указывает расположение рабочего окружения Go.
GOPROXY: Устанавливает URL прокси-сервера для скачивания Go-модулей.
GOROOT: Указывает путь к месту хранения бинарных файлов Go и исходных кодов.
GOSUMDB: Настроивает базу данных контрольных сумм для модулей и, если необходимо, открытый ключ и URL.
GOTMPDIR: Определяет директорию для хранения временных файлов во время сборки.
GOVCS: Настроит разрешенные системы контроля версий для определенных модулей.
GO111MODULE: Управляет режимом работы модулей (например, включение или выключение поддержки Go-модулей).

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
1