Я долгое время был разработчиком программного обеспечения, я видел много языков, фреймворков и инструментов, я использовал некоторые из них и только пробовал "hello world" с большинством, но в последнем лет я все больше и больше слышу о Go lang. Go — это относительно новый язык программирования, который был создан около 13 лет назад на момент написания этой статьи. 13 лет — это долгий срок, если вы спросите меня, потому что технологии рождаются и умирают быстрее, но я думаю, что это хороший момент, чтобы попытайтесь выучить его не только из-за ажиотажа вокруг этого языка, но и потому, что это уже проверенный язык многими компаниями, которые используют его для создания потрясающих продуктов и инструментов.

Итак, предложение этого блога состоит в том, чтобы вести учет моего обучения в надежде, что это может быть полезно для большего количества разработчиков.

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

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

Ну, поехали!

Нам нужен Docker desktop версии 4.12.0 (85629) или выше, этот инструмент доступен для Mac, Windows и Linux, его легко установить, он готов к работе и поставляется с докером и докером. - сочинить сразу. Однако вы можете установить оба вручную, если хотите. На момент написания этого поста я использую docker v20.10.17 и docker-compose v2.10.2.

Примечание. Docker — это инструмент, написанный на Go, и это здорово, потому что это означает, что мы занимаемся своего рода «кодированием».

После установки мы можем проверить версии, выполнив следующие команды на терминале:

Чтобы узнать установленную версию движка Docker:

docker --version

Чтобы узнать установленную версию docker-compose:

docker-compose --version

Если обе команды работают нормально, мы готовы начать.

Сначала мы должны создать рабочий каталог на нашем локальном компьютере, мы можем сделать это с помощью средства поиска файлов или попробовав следующую команду непосредственно на терминале:

mkdir ~/go-app && cd ~/go-app

Оказавшись там, мы должны запустить проект git.

git init

Нам нужен файл .gitignore, потому что мы не хотим отслеживать ненужные файлы в нашем репозитории, особенно потому, что Go будет генерировать исполняемые файлы после сборки, но как я не уверен, что мы должны игнорировать? m, используя этот из gitignore repo, добавляя несколько дополнительных строк для игнорирования файлов IDE и Mac OS, на данный момент он должен работать нормально, однако мы можем его обновить. позже, если нужно.

Содержимое файла .gitignore выглядит следующим образом:

# Misc
.DS_Store
.idea
.vscode

# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib

# Test binary, built with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Dependency directories
vendor/

# Go workspace file
go.work

Нам нужно установить зависимости проекта, так как мы будем использовать модули Go, которые представляют собой систему управления зависимостями для языка Go, необходимо создать файл go.mod со следующим содержимым:

module app
go 1.19

Директива module определяет имя нашего модуля (оно должно быть уникальным, особенно если мы планируем опубликовать его на pkg.go.dev).

Директива go предназначена для определения версии Go, используемой для написания модуля.

Вы можете увидеть ссылку на файл go.module здесь.

Модули Go чем-то похожи на NPM для Node.js, а go.mod похож на файл package.json.

Теперь код, для которого мы создаем файл main.go, который является стандартным именем для основного файла для приложения Go.

Содержимое нашего main.go должно выглядеть так:

package main

import "fmt"

func main() {
   fmt.Println("hello world")
}

Попробую объяснить, что там происходит:

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

package command-line-arguments is not a main package

После этого мы импортируем пакет «формат», используя следующую строку:

import "fmt"

Затем мы определяем функцию main и используем функцию Println из пакета fmt. для отображения сообщения «hello world» в консоли.

func main() {
   fmt.Println("hello world")
}

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

Теперь мы собираемся запустить наш код, но подождите, мы будем использовать для этого докер, затем необходимо выполнить некоторые шаги.

Чтобы настроить нашу среду Go с помощью docker, мы должны создать Dockerfile со следующим содержимым:

FROM golang:1.19.2-alpine

ENV GO111MODULE=on
WORKDIR /app

COPY go.* ./
RUN go mod download
COPY . .

CMD ["go", "run", "main.go"]

Но что там происходит?

В первой строке указывается образ, который будет использоваться для создания контейнера:

FROM golang:1.19.2-alpine

Я использую последнюю версию Go, доступную в Docker Hub, v1.19.2 на данный момент, чтобы написать этот пост. Для этого проекта я выбрал ОС Alpine, которая представляет собой облегченный дистрибутив Linux. Вместо этого мы могли бы использовать FROM golang:latest, но лучше заблокировать версию, чтобы избежать ошибок с критическими изменениями в будущих выпусках. идти язык.

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

ENV GO111MODULE=on

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

Также нам нужен рабочий каталог внутри контейнера докеров, для этого мы должны определить его в нашем Dockerfile со следующей строкой:

WORKDIR /app

После этого мы скопируем файл go.mod в контейнер докеров, используя следующую строку:

COPY go.* ./

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

Чтобы установить все зависимости, мы добавили следующую строку

RUN go mod download

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

COPY . .

Наконец, мы создаем и запускаем файл main.go со следующей строкой:

CMD ["go", "run", "main.go"]

Сначала нам нужно создать образ докера с помощью следующей команды:

docker build -t go-app

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

docker run go-app

Но мы можем улучшить это с помощью docker-compose, для этого мы должны создать файл docker-compose.yml со следующим содержимым:

version: "3.7"

services:
  app:
    build:
      context: .
    container_name: app
    command: "tail -f /dev/null"
    volumes:
      - .:/app

В этом файле мы используем версию 3.7, однако мы могли бы использовать и «3», но, как я уже упоминал ранее, рекомендуется заблокировать конкретную версию, чтобы не нарушить синтаксис docker-compose:

version: "3.7"

Кроме того, мы определили одну службу с именем app:

services:
  app:

Поскольку мы создали Dockerfile в проекте, мы должны определить контекст для поиска Dockerfile, чтобы создать образ и создать контейнер с именем app:

app:
    build:
      context: .
    container_name: app

Примечание. Имя контейнера не совпадает с именем службы.

Также нам нужно синхронизировать содержимое нашего проекта с контейнером, для этого мы можем использовать тома:

volumes:
  - .:/app

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

И, наконец, нам нужна точка входа или команда, чтобы контейнер всегда работал:

command: "tail -f /dev/null"

Но почему бы не использовать команду go run main.go так же, как в Dockerfile, конечно, мы можем, но, поскольку мы должны добавить больше файлов, это хорошая идея, чтобы контейнер выполнялся для выполнения этой команды непосредственно в контейнере формы bash без необходимости каждый раз поднимать его. без необходимости.

Есть несколько способов выполнить наш код из контейнера докеров:

Первый:

docker-compose exec app go run main.go

И еще один, использующий оболочку контейнера:

docker-compose exec app sh

Таким образом, мы можем работать напрямую с сеансом bash:

go run main.go

чтобы убить сеанс bash, мы должны ввести:

exit

Или просто введите `ctrl+d`.

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

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

Спасибо за прочтение.