---
title: Базовые вопросы · часть 2
seo:
  title: Базовые вопросы · часть 2 — Go Developer
  description: Тема «Базовые вопросы · часть 2» для собеседования Go Developer. Что такое CI/CD? Что такое линтеры (linters) зачем они нужны и как их использовать?
---

[Все темы Go Developer](/go-developer)

## <strong>Что такое</strong> <code>CI&#47;CD</code><strong>?</strong> [#q-14bee738d69b816fb947c80f3d78efc9]

<code>CI&#47;CD</code> (Continuous Integration / Continuous Deployment) — это
методики и набор практик для автоматизации разработки, тестирования и
развертывания программного обеспечения. В контексте Go (Golang) это включает
следующие ключевые моменты&#58;

{/* prettier-ignore */}
1. <strong>Continuous Integration (</strong><code>CI</code><strong>)</strong>&#58;

    - Автоматическое тестирование и сборка кода при каждом изменении.

    - Использование инструментов, таких как Jenkins, GitHub Actions, GitLab CI/CD или Travis CI.

    - Проверка, что новый код совместим с существующим и не ломает функциональность.

1. <strong>Continuous Deployment (</strong><code>CD</code><strong>)</strong>&#58;

    - Автоматическое развертывание нового кода на рабочие серверы после успешного прохождения всех тестов.

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

    - Использование оркестрационных инструментов, таких как Kubernetes, Docker, Ansible, Terraform.

Для проектов на Go это может включать&#58;

- Написание юнит-тестов с использованием пакета <code>testing</code>.

- Настройку CI/CD пайплайнов для автоматической сборки Go приложений.

- Автоматический запуск go vet и выбранного линтера, например Staticcheck.

- Сборку и упаковку приложений в Docker-контейнеры.

- Развертывание приложений в облачные среды или на серверы.

:::note[Ссылки для изучения]

1. [Построение процесса CI/CD. Go](https://ru.werf.io/guides/golang/400_ci_cd_workflow/030_gitlab_ci_cd.html)
   :::

---

## <strong>Что такое линтеры (</strong><code>linters</code><strong>) зачем они нужны и как их использовать?</strong> [#q-14bee738d69b8163b192fbd5bb25f4d2]

Линтеры (<code>linters</code>) — это инструменты для анализа исходного кода, которые автоматически проверяют его на наличие ошибок, нарушение стиля и других потенциальных проблем.

#### Зачем нужны линтеры&#58;

1. <strong>Повышение качества кода</strong>&#58; Линтеры помогают обнаружить
   ошибки и проблемные места еще на этапе написания кода.

1. <strong>Соблюдение стиля</strong>&#58; Линтеры проверяют, что код
   соответствует установленным стандартам кодирования, делая его более читаемым
   и поддерживаемым.

1. <strong>Уменьшение количества багов</strong>&#58; Раннее выявление ошибок
   помогает снизить количество багов в будущем.

#### Как использовать линтеры&#58;

1. Установка&#58; выберите поддерживаемый анализатор. golint архивирован; Staticcheck устанавливается командой go install honnef.co/go/tools/cmd/staticcheck@latest. go vet входит в инструментарий Go.

1. Запуск&#58; выполните go vet ./... и, если установлен Staticcheck, staticcheck ./... в каталоге модуля.

1. <strong>Интеграция в CI/CD</strong>&#58; Линтеры часто интегрируются в CI/CD
   пайплайны, чтобы автоматизировать проверку качества кода при каждом коммите.

Примеры линтеров для разных языков&#58;

- Go&#58; go vet и Staticcheck.

- <strong>Python</strong>&#58; <code>pylint</code>, <code>flake8</code>

- <strong>JavaScript</strong>&#58; <code>eslint</code>

:::note[Ссылки для изучения]

1. [Построение процесса CI/CD. Go](https://ru.werf.io/guides/golang/400_ci_cd_workflow/030_gitlab_ci_cd.html)
   :::

---

## <strong>Как можно измерить использование памяти в Go? Что такое</strong> <code>pprof</code><strong>?</strong> [#q-14bee738d69b8145b9cacb7ae702a4d7]

Для измерения использования памяти в Go можно использовать пакет <code>runtime</code>&#58;

```go
package main

import (
	"fmt"
	"runtime"
)

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m)
	fmt.Printf("Allocated: %v KB\\n", m.Alloc/1024)
	fmt.Printf("Total Allocated: %v KB\\n", m.TotalAlloc/1024)
	fmt.Printf("Heap Allocated: %v KB\\n", m.HeapAlloc/1024)
	fmt.Printf("Heap Objects: %v\\n", m.HeapObjects)
}
```

<code>pprof</code> — это инструмент для профилирования производительности и
памяти приложений Go. Он позволяет собирать и анализировать данные о CPU,
памяти, горутинах и блокировках.

#### Как использовать <code>pprof</code>&#58;

{/* prettier-ignore */}
1. <strong>Импорт пакета</strong>&#58;

    ```go
    import _ "net/http/pprof"
    ```

1. <strong>Добавление в код</strong>&#58;

    ```go
    import (
        "net/http"
        _ "net/http/pprof"
    )

    func main() {
        go func() {
            log.Println(http.ListenAndServe("localhost:6060", nil))
        }()
        // Ваше приложение
    }
    ```

1. <strong>Запуск и доступ</strong>&#58;

    - Запустите приложение.

    - Откройте браузер и перейдите по адресу <code>http&#58;&#47;&#47;localhost&#58;6060&#47;debug&#47;pprof&#47;</code>.

1. <strong>Анализ данных</strong>&#58;

    - Снимите профили памяти и CPU.

    - Проанализируйте их с помощью команды <code>go tool pprof</code>.

Пример команды для анализа профиля CPU&#58;

```go
go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=30"
```

:::note[Ссылки для изучения]

1. [Построение процесса CI/CD. Go](https://ru.werf.io/guides/golang/400_ci_cd_workflow/030_gitlab_ci_cd.html)
   :::

---

## <strong>Что такое</strong> <code>Prometheus</code> <strong>и</strong> <code>Grafana</code><strong>? Зачем они нужны?</strong> [#q-14bee738d69b81319273ec16faa0876f]

<code>Prometheus</code> — это система мониторинга и сбора метрик с открытым
исходным кодом, предназначенная для мониторинга и оповещения.

#### Основные функции&#58;

- <strong>Сбор метрик</strong>&#58; Сбор данных с различных источников в
  реальном времени.

- <strong>Хранение данных</strong>&#58; Эффективное хранение временных рядов
  данных.

- <strong>Запросы и анализ</strong>&#58; Использование языка запросов PromQL для
  анализа данных.

- <strong>Оповещения</strong>&#58; Настройка правил оповещений на основе
  собранных данных.

<code>Grafana</code> — это платформа для визуализации данных с открытым исходным
кодом.

#### Основные функции&#58;

- <strong>Визуализация</strong>&#58; Создание интерактивных и настраиваемых
  дашбордов.

- <strong>Интеграция</strong>&#58; Поддержка множества источников данных,
  включая Prometheus.

- <strong>Мониторинг в реальном времени</strong>&#58; Отображение данных и
  метрик в реальном времени.

- <strong>Оповещения</strong>&#58; Настройка уведомлений на основе метрик и
  данных.

#### Пример использования&#58;

1. <strong>Prometheus</strong> собирает метрики из приложения.

1. <strong>Grafana</strong> визуализирует эти метрики в виде графиков и
   дашбордов.

1. Настраиваются оповещения в Grafana на основе данных из Prometheus для своевременного уведомления о проблемах.

Вместе, <code>Prometjeus</code> и <code>Grafana</code> образуют мощный инструмент для мониторинга и управления инфраструктурой.

:::note[Ссылки для изучения]

1. [Построение процесса CI/CD. Go](https://ru.werf.io/guides/golang/400_ci_cd_workflow/030_gitlab_ci_cd.html)
   :::
