SobesLab

Junior

  1. Какие базовые типы данных есть в Go? Junior

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

    Посмотреть ответ полностью
  2. Как объявлять переменные в Go? Junior

    В Go переменные объявляются с помощью ключевого слова var, инициализации при объявлении или короткой записи := внутри функций, при этом язык статически типизированный, что требует явного указания типов и использования инициализации для предотвращения ошибок.

    Посмотреть ответ полностью
  3. Разница между `=` и `:=`? Junior

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

    Посмотреть ответ полностью
  4. Можно ли объявить переменную и не использовать её? Junior

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

    Посмотреть ответ полностью
  5. Что такое указатель в Go и как с ним работать? Junior

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

    Посмотреть ответ полностью
  6. Что такое структура (`struct`) и зачем она? Junior

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

    Посмотреть ответ полностью
  7. Что такое массив и чем он отличается от среза? Junior

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

    Посмотреть ответ полностью
  8. Как добавить элемент в срез и что происходит под капотом? Junior

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

    Посмотреть ответ полностью
  9. Как скопировать элементы одного среза в другой? Junior

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

    Посмотреть ответ полностью
  10. Как удалить элемент из среза по индексу? Junior

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

    Посмотреть ответ полностью
  11. Что такое `map` и когда его использовать? Junior

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

    Посмотреть ответ полностью
  12. Как создать `map` и проверить наличие ключа? Junior

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

    Посмотреть ответ полностью
  13. Что будет при записи в `nil`-map? Junior

    Запись в nil-map в Go приводит к панике, так как такой map не инициализирован и не может содержать данные; для предотвращения ошибок необходимо всегда инициализировать map перед использованием.

    Посмотреть ответ полностью
  14. Почему строки в Go неизменяемы и что с этим делать? Junior

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

    Посмотреть ответ полностью
  15. Чем отличаются `rune` и `byte`? Junior

    byte — это 8-битный тип для представления символов в ASCII и бинарных данных, тогда как rune — 32-битный тип для работы с символами Unicode, что позволяет обрабатывать многоязычный текст и специальные символы.

    Посмотреть ответ полностью
  16. Что такое нулевое значение (zero value)? Junior

    Нулевое значение в Go — это значение, присваиваемое переменной при объявлении без инициализации, и оно зависит от типа данных (например, 0 для int, false для bool, пустая строка для string). Это позволяет избежать неопределенности и упрощает код, гарантируя, что переменные имеют значения по умолчанию.

    Посмотреть ответ полностью
  17. Какие типы могут быть `nil`? Junior

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

    Посмотреть ответ полностью
  18. Что означает заглавная буква в имени идентификатора? Junior

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

    Посмотреть ответ полностью
  19. Для чего нужен пакет `main`? Junior

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

    Посмотреть ответ полностью
  20. Может ли функция в Go возвращать несколько значений? Junior

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

    Посмотреть ответ полностью
  21. Что такое blank-идентификатор `_` и где он используется? Junior

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

    Посмотреть ответ полностью
  22. Есть ли в Go перегрузка функций или операторов? Junior

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

    Посмотреть ответ полностью
  23. Есть ли в Go механизм исключений (try/catch)? Junior

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

    Посмотреть ответ полностью
  24. Как объединить две строки в одну? Junior

    Объединение строк в Go можно осуществить с помощью оператора +, функции fmt.Sprintf, strings.Join для срезов и strings.Builder для многократного объединения, при этом выбор метода зависит от требований к производительности и сложности задачи.

    Посмотреть ответ полностью
  25. Как получить подстроку из строки в Go? Junior

    В Go подстрока извлекается с помощью срезов, используя синтаксис originalString[start:end], где start — индекс первого символа, а end — индекс первого символа, который не включается. Индексация начинается с нуля, и важно следить за тем, чтобы индексы не выходили за пределы длины строки.

    Посмотреть ответ полностью
  26. Как сравнить две строки на равенство в Go? Junior

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

    Посмотреть ответ полностью
  27. Является ли Go статически типизированным языком или динамически типизированным? Junior

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

    Посмотреть ответ полностью
  28. В Go параметры функций передаются по значению или по ссылке? Junior

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

    Посмотреть ответ полностью

Middle

  1. Что делает оператор `defer` в Go? Middle

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

    Посмотреть ответ полностью
  2. В каком порядке выполняются несколько объявленных defer-вызовов? Middle

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

    Посмотреть ответ полностью
  3. Что такое метод в Go и чем он отличается от функции? Middle

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

    Посмотреть ответ полностью
  4. Когда стоит определять метод с указателем-получателем (pointer receiver)? Middle

    Использование указателя-получателя в Go оправдано, когда метод изменяет состояние структуры, необходимо избежать копирования больших объектов или реализуется интерфейс с изменением состояния; это повышает производительность, но требует учета возможных значений nil и управления жизненным циклом объектов.

    Посмотреть ответ полностью
  5. Есть ли в Go классы и наследование? Middle

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

    Посмотреть ответ полностью
  6. Что такое встраивание (embedded struct) и зачем его используют? Middle

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

    Посмотреть ответ полностью
  7. Что такое интерфейс (interface) в Go? Middle

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

    Посмотреть ответ полностью
  8. Может ли один тип реализовать несколько интерфейсов в Go? Middle

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

    Посмотреть ответ полностью
  9. Как проверить, что тип T удовлетворяет интерфейсу I? Middle

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

    Посмотреть ответ полностью
  10. Что такое пустой интерфейс (interface{})? Middle

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

    Посмотреть ответ полностью
  11. Как из значения типа interface{} получить конкретное значение определенного типа? Middle

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

    Посмотреть ответ полностью
  12. Что такое type switch в Go? Middle

    Type switch в Go позволяет проверять динамический тип переменной интерфейса и выполнять различные действия в зависимости от этого типа, что делает код более гибким и понятным.

    Посмотреть ответ полностью
  13. Как организовать написание и запуск тестов в Go? Middle

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

    Посмотреть ответ полностью
  14. Для чего используется инструмент `go fmt`? Middle

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

    Посмотреть ответ полностью
  15. Что такое затенение (shadowing) переменных? Middle

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

    Посмотреть ответ полностью
  16. Поддерживает ли Go дженерики (обобщённые типы)? Middle

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

    Посмотреть ответ полностью
  17. Что такое Go Modules и зачем они нужны? Middle

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

    Посмотреть ответ полностью
  18. Для чего предназначены переменные окружения GOROOT и GOPATH? Middle

    Переменные окружения GOROOT и GOPATH в Go отвечают за настройку рабочего окружения: GOROOT указывает на директорию с установленной стандартной библиотекой и инструментами Go, а GOPATH — на рабочую директорию для проектов и зависимостей, где соблюдается определенная структура каталогов.

    Посмотреть ответ полностью
  19. Как скомпилировать и запустить Go-приложение? Middle

    Для компиляции и запуска Go-приложения необходимо создать структуру проекта с файлом go.mod и основным файлом main.go, инициализировать модуль, использовать команду go build для компиляции и ./my-go-app для запуска, или воспользоваться командой go run для быстрого тестирования без создания исполняемого файла.

    Посмотреть ответ полностью
  20. Гарантирован ли порядок обхода элементов в map при итерации? Middle

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

    Посмотреть ответ полностью
  21. Как устроен срез (slice) внутри себя? Middle

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

    Посмотреть ответ полностью
  22. Что показывают len и cap у среза? Middle

    len показывает количество элементов в срезе, а cap — максимальную ёмкость, которую он может вместить без перераспределения памяти. Понимание этих значений важно для эффективного использования срезов в Go.

    Посмотреть ответ полностью
  23. Можно ли сравнить два среза на равенство через `==`? Middle

    В Go срезы нельзя сравнивать с помощью оператора ==, так как они являются ссылочными типами; для их сравнения нужно вручную проверять длину и элементы или использовать пакет reflect, учитывая возможные проблемы с производительностью.

    Посмотреть ответ полностью
  24. Как конвертировать срез байт []byte в строку и наоборот? Middle

    Конвертация между срезами байт и строками в Go осуществляется с помощью функций string() и []byte(), при этом важно учитывать корректность кодировки UTF-8 и управление памятью, так как строки неизменяемы, а срезы байт — изменяемы.

    Посмотреть ответ полностью
  25. Что такое panic и как с ней работать? Middle

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

    Посмотреть ответ полностью
  26. Что такое замыкание (closure) в Go? Middle

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

    Посмотреть ответ полностью
  27. Что произойдёт при делении целого числа и числа с плавающей точкой на ноль? Middle

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

    Посмотреть ответ полностью
  28. Что будет, если в функции объявить переменную с тем же именем, что и глобальная (внешняя)? Middle

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

    Посмотреть ответ полностью
  29. Можно ли внутри функции создать блок кода в фигурных скобках без условия или цикла? Зачем это нужно? Middle

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

    Посмотреть ответ полностью
  30. Что такое идентификатор `iota` в Go? Middle

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

    Посмотреть ответ полностью
  31. Как определить собственный тип ошибки (custom error) в Go? Middle

    В Go собственный тип ошибки создаётся путём определения нового типа, который реализует интерфейс error, добавляя метод Error() string. Это позволяет более точно описывать ошибки с дополнительным контекстом, улучшая отладку и обработку.

    Посмотреть ответ полностью
  32. Позволяет ли Go объявлять перечисления (enum)? Middle

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

    Посмотреть ответ полностью
  33. Для чего используется утилита `go vet`? Middle

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

    Посмотреть ответ полностью
  34. Можно ли напрямую проверить, равны ли два словаря (map) между собой? Middle

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

    Посмотреть ответ полностью
  35. Какие типы нельзя сравнивать оператором `==` напрямую? Middle

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

    Посмотреть ответ полностью
  36. Какие типы могут использоваться в качестве ключей в map? Middle

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

    Посмотреть ответ полностью
  37. Как правильно сравнить содержимое двух срезов на равенство? Middle

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

    Посмотреть ответ полностью
  38. Что означает `...` (троеточие) при объявлении параметров функции и при вызове функции? Middle

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

    Посмотреть ответ полностью

Senior

  1. Как работает сборщик мусора (Garbage Collector) в Go? Senior

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

    Посмотреть ответ полностью
  2. Как снизить задержки от работы сборщика мусора в производительных приложениях? Senior

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

    Посмотреть ответ полностью
  3. Что такое escape analysis в Go? Senior

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

    Посмотреть ответ полностью
  4. Почему считается, что "встраивание не равно наследование" в Go? Senior

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

    Посмотреть ответ полностью
  5. Каковы основные преимущества языка Go? Senior

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

    Посмотреть ответ полностью
  6. Какие недостатки и ограничения есть у Go? Senior

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

    Посмотреть ответ полностью
  7. Как реализованы ограничения (constraints) в дженериках Go? Senior

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

    Посмотреть ответ полностью
  8. Как реализованы map в Go под капотом? Senior

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

    Посмотреть ответ полностью
  9. Как изменяется емкость динамического массива при росте среза? Senior

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

    Посмотреть ответ полностью
  10. Каков размер пустой структуры struct{} и зачем она может использоваться? Senior

    Пустая структура struct{} в Go занимает 0 байт и используется для экономии памяти, создания уникальных типов и сигнализации, не требуя хранения данных; она полезна для реализации паттернов, таких как наблюдатели и множества.

    Посмотреть ответ полностью
  11. В чем недостатки использования рефлексии (reflect) в Go? Senior

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

    Посмотреть ответ полностью
  12. Для чего предназначен пакет unsafe? Senior

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

    Посмотреть ответ полностью
  13. Почему interface{} со значением nil внутри не равен nil? Senior

    В Go пустой интерфейс interface{} с присвоенным значением nil не равен nil, потому что он содержит два поля: тип и значение, где тип не определен, даже если значение равно nil, что делает сам интерфейс неравным nil.

    Посмотреть ответ полностью
  14. Когда вычисляются аргументы функций, переданных в defer? Senior

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

    Посмотреть ответ полностью
  15. Что произойдет при вызове recover вне отложенной функции? Senior

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

    Посмотреть ответ полностью
  16. Как завершить выполнение программы без выполнения отложенных функций? Senior

    Для завершения программы в Go без выполнения отложенных функций используется os.Exit(), которая немедленно завершает выполнение, игнорируя отложенные вызовы. Также можно использовать panic(), но в этом случае стоит применять recover() и затем вызвать os.Exit(), чтобы избежать выполнения отложенных функций.

    Посмотреть ответ полностью
  17. Чем отличается panic от os.Exit()? Senior

    panic используется для обработки фатальных ошибок и прерывает выполнение горутины, позволяя восстановиться через recover, в то время как os.Exit() завершает программу немедленно с указанным кодом возврата, не выполняя отложенные функции и не предоставляя информации о стеке вызовов.

    Посмотреть ответ полностью
  18. Как очистить все содержимое словаря (map)? Senior

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

    Посмотреть ответ полностью
  19. Как представлено значение интерфейсного типа (interface) в памяти? Senior

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

    Посмотреть ответ полностью
  20. Можно ли в Go работать с очень большими числами (выходящими за пределы int64)? Senior

    В Go можно работать с очень большими числами с помощью пакета math/big, который предоставляет типы big.Int, big.Float и big.Rat для работы с целыми, дробными и рациональными числами произвольной длины, что позволяет избежать переполнения стандартных типов и использовать дополнительные математические функции.

    Посмотреть ответ полностью
  21. Гарантируется ли порядок вычисления аргументов функции в Go? Senior

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

    Посмотреть ответ полностью
  22. Оптимизирует ли компилятор Go хвостовую рекурсию (tail call optimization)? Senior

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

    Посмотреть ответ полностью
  23. Как ограничить компиляцию Go-файла для определённой операционной системы или архитектуры? Senior

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

    Посмотреть ответ полностью
  24. Что произойдёт, если структура одновременно встраивает два типа с одинаковыми методами? Senior

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

    Посмотреть ответ полностью
  25. Для чего используется blank import (импорт с "_")? Senior

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

    Посмотреть ответ полностью
  26. Можно ли вызывать метод с pointer-приемником на значении структуры и наоборот? Senior

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

    Посмотреть ответ полностью
  27. Что позволяет сделать пакет embed (директива `//go:embed`)? Senior

    Директива //go:embed в Go позволяет встраивать статические файлы непосредственно в бинарный файл приложения, упрощая развертывание и управление ресурсами, а также избегая проблем с файловой системой.

    Посмотреть ответ полностью
  28. Что означают символы `~` и `|` при описании ограничений обобщённого типа в Go? Senior

    Символ ~ в Go указывает, что обобщённый тип может быть конкретным типом или его подтипом, а символ | позволяет обобщённому типу принимать несколько различных типов, что делает код более универсальным и гибким.

    Посмотреть ответ полностью

Смежные категории

Рекомендуемые категории