Go собеседования
622 subscribers
106 photos
224 links
Подготовка к собеседованиям на позицию Go-разработчик

Еще больше на сайте https://frontview-it.ru

Backend собеседования - @frontview_backend
Go работа - @frontview_go_vacancies
Все IT вакансии - @frontview_all_vacancies
Download Telegram
▶️ Интерфейс error используется для обработки ошибок. Это встроенный интерфейс с одним методом Error() string, который возвращает строковое описание ошибки. Любой тип, реализующий этот метод, удовлетворяет интерфейсу error.


type MyError struct {
Message string
}

func (e *MyError) Error() string {
return e.Message
}

func someFunction() error {
return &MyError{"Something went wrong"}
}


В этом примере MyError реализует интерфейс error через метод Error(). Функция someFunction возвращает ошибку типа MyError. Это позволяет стандартизировать обработку ошибок и передавать их между функциями.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
Команда go mod vendor создает директорию vendor в проекте, куда копируются все зависимости, указанные в go.mod. Это позволяет изолировать зависимости и использовать их локально, что полезно для обеспечения воспроизводимости сборки без необходимости доступа к внешним репозиториям.

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7💯1
✏️ Методы в Go — это функции, привязанные к конкретному типу. Они позволяют добавлять поведение к структурам или другим пользовательским типам. Метод определяется с указанием получателя (receiver) между ключевым словом func и именем метода.

Получатель может быть как значением, так и указателем. Если получатель — значение, метод работает с копией объекта. Если получатель — указатель, метод может изменять оригинальный объект.


type Rectangle struct {
width, height float64
}

// Метод с получателем по значению
func (r Rectangle) Area() float64 {
return r.width * r.height
}

// Метод с получателем по указателю
func (r *Rectangle) Scale(factor float64) {
r.width *= factor
r.height *= factor
}


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

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Для проверки наличия ключа в map используется второе возвращаемое значение при доступе по ключу. Если ключ существует, возвращается true, иначе — false.

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
✔️ Type assertion позволяет извлекать конкретный тип из значения интерфейса. Это полезно, когда нужно работать с конкретным типом, скрытым за интерфейсом.


var i interface{} = "hello"
s := i.(string) // Извлечение string из интерфейса
fmt.Println(s) // Вывод: hello


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


s, ok := i.(string) // ok будет false, если тип не совпадает


Type assertion помогает работать с динамическими типами в интерфейсах, обеспечивая безопасное приведение типов.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92
Docker — это платформа для разработки, доставки и запуска приложений в изолированных контейнерах, которые содержат все необходимое для работы программы. В разработке Docker используется для создания воспроизводимых окружений, упрощения деплоя и обеспечения консистентности между различными средами.

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
🔘 Для выполнения SQL-запросов с помощью db.Query используется метод из пакета database/sql. Метод возвращает набор строк, который необходимо обработать и закрыть после использования.


rows, err := db.Query("SELECT id, name FROM users WHERE age > ?", 18)
if err != nil {
log.Fatal(err)
}
defer rows.Close() // Закрыть rows после завершения

for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatal(err)
}
fmt.Println(id, name)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}


Метод Query принимает SQL-запрос и аргументы, возвращая *sql.Rows. После обработки данных важно закрыть rows с помощью defer, чтобы избежать утечек ресурсов. Ошибки на каждом этапе (запрос, итерация, сканирование) должны быть обработаны.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Для обработки GET-запросов используется пакет net/http. Создается обработчик, который принимает http.ResponseWriter и *http.Request, извлекает данные из запроса и возвращает ответ.


http.HandleFunc("/example", func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
return
}

param := r.URL.Query().Get("param") // Извлечение параметра из URL
fmt.Fprintf(w, "Received param: %s", param)
})

http.ListenAndServe(":8080", nil)


Метод r.URL.Query() позволяет получить параметры из URL. Обработчик проверяет метод запроса и возвращает ошибку, если метод не GET. Сервер запускается на указанном порту с помощью ListenAndServe.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82
Утечки горутин часто возникают из-за незавершенных или заблокированных горутин. Для предотвращения утечек важно использовать контексты для отмены операций, каналы с таймаутами и следить за завершением всех запущенных горутин.

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
🟢Пакет os предоставляет функции для взаимодействия с операционной системой, такие как работа с файлами, переменными окружения и процессами.


file, err := os.Create("example.txt") // Создание файла
if err != nil {
log.Fatal(err)
}
defer file.Close()

file.WriteString("Hello, OS package!") // Запись в файл

env := os.Getenv("HOME") // Получение переменной окружения
fmt.Println("Home directory:", env)


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

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👀21
CI/CD (Continuous Integration/Continuous Delivery) — это практика автоматизации процессов интеграции кода, тестирования и доставки в production. Основные преимущества включают ускорение разработки, повышение качества кода и минимизацию рисков при развертывании.

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32
🔘Пакет fmt предоставляет функции для форматированного ввода и вывода. Основные функции: Print, Println, Printf, Sprint, Sprintf, Fprintf, Scan, Scanf, Scanln.

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


fmt.Println("Hello", "World") // Hello World
fmt.Printf("Number: %d, String: %s\n", 42, "Go") // Number: 42, String: Go


Sprint и Sprintf возвращают строку вместо вывода:


s := fmt.Sprintf("Value: %v", 3.14) // s = "Value: 3.14"


Fprintf выводит данные в произвольный io.Writer:


fmt.Fprintf(os.Stderr, "Error: %s\n", "file not found")


Для ввода используются Scan, Scanf, Scanln, которые считывают данные из стандартного ввода.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍111
Чтобы проверить, реализует ли тип определённый интерфейс, используется утверждение типа с пустым идентификатором. Если тип не реализует интерфейс, это вызовет ошибку компиляции.

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Для десериализации JSON в структуру используется пакет encoding/json. Основная функция — json.Unmarshal, которая принимает байтовый срез с JSON-данными и указатель на структуру, куда нужно сохранить результат.


package main

import (
"encoding/json"
"fmt"
)

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

func main() {
data := []byte(`{"name": "John", "age": 30}`)
var p Person
err := json.Unmarshal(data, &p)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(p) // {John 30}
}


Структура Person содержит аннотации json:"name", которые указывают, как сопоставлять поля JSON с полями структуры. Если имена полей JSON и структуры совпадают, аннотации можно опустить. Ошибка при десериализации возвращается через err.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
Логирование ошибок должно быть структурированным и информативным, включая контекст, например, место возникновения ошибки и дополнительные данные. Использование уровней логирования (error, warn, info) помогает фильтровать и анализировать сообщения.

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Массив и срез — это коллекции элементов одного типа, но с ключевыми различиями.

Массив имеет фиксированную длину, которая определяется при объявлении.


var arr [3]int // Массив из 3 элементов


Срез — это динамическая структура, которая может изменять свой размер. Он ссылается на часть массива или создает новый массив под капотом.


slice := []int{1, 2, 3} // Срез с начальными значениями
slice = append(slice, 4) // Добавление элемента


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

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Указатели хранят адрес памяти переменной, позволяя работать с исходными данными, а не с их копией. Значения, напротив, копируют данные, что может быть менее эффективно при работе с большими структурами или при необходимости изменять исходные данные.

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
Для реализации тайм-аута с использованием select можно использовать канал time.After, который возвращает значение через указанное время. Это позволяет организовать ожидание с ограничением по времени.


select {
case <-time.After(2 * time.Second):
fmt.Println("Timeout reached") // Сработает, если прошло 2 секунды
case result := <-someChannel:
fmt.Println("Received:", result) // Сработает, если данные пришли раньше
}


В этом примере, если данные не приходят на someChannel в течение 2 секунд, выполняется ветка с тайм-аутом. Это полезно для предотвращения бесконечного ожидания в каналах.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥43
switch — это конструкция для упрощения множественных сравнений. Она позволяет выбирать одну из веток выполнения в зависимости от значения выражения, делая код чище и читабельнее.

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
👉 Приведение типов в Go выполняется явно, так как язык строго типизирован и не поддерживает неявное преобразование. Для приведения используется синтаксис T(v), где T — целевой тип, а v — значение.


var x int = 42
var y float64 = float64(x) // Приведение int к float64
var z uint = uint(y) // Приведение float64 к uint


Приведение работает только между совместимыми типами, например, числовыми. Попытка приведения несовместимых типов (например, строки к числу) вызовет ошибку компиляции. Для сложных преобразований используются функции из стандартной библиотеки, такие как strconv.Atoi.

✈️ Go собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51