В этой серии вы найдете краткий практический подход к изучению языка Go.

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

Подготовка

Загрузите версию Go, подходящую для вашей платформы — Windows, Linux, Mac, с https://golang.org/dl/. Поскольку у меня Mac OS, я скачал https://golang.org/doc/install?download=go1.14.4.darwin-amd64.pkg.

Запустите установщик и следуйте инструкциям. Путь установки по умолчанию для Mac OS:

/usr/local/go

Установщик также добавляет указанный ниже каталог в переменную пути.

/usr/local/go/bin

Для других операционных систем следуйте инструкциям с https://golang.org/doc/install.

Чтобы проверить успешность установки, откройте новое окно терминала и запустите

go version

Вы должны увидеть результат, похожий на

go version go1.14.4 darwin/amd64

Первая исполняемая программа

Мы начнем с простой программы, которая печатает «Hello, world». к консоли.

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

/Users/vinay/concisego

В дальнейшем я буду называть этот путь к каталогу «workspace».

Создайте здесь каталог под названием «hello» и перейдите в этот каталог:

mkdir /Users/vinay/concisego/hello
cd /Users/vinay/concisego/hello

Создайте исходный файл с именем hello.go со следующим содержимым:

package main
import "fmt"
func main() {
    fmt.Println("Hello, world.")
}
  • Первая строка — это имя пакета. Здесь мы указываем имя пакета как «основной». Если мы хотим, чтобы Go создал исполняемый файл, нам нужно использовать это имя пакета.
  • «fmt» — это стандартный пакет go, который мы импортируем для печати текста.
  • main() — это функция, необходимая для исполняемой программы. Функция может принимать ноль или более аргументов и возвращать ноль или более значений. main() — это просто специальная функция.

Чтобы запустить программу,

go run hello.go

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

Hello, world.

Чтобы распространять программу, ее нужно собрать. Запустите следующее:

go build

Вы должны увидеть новый исполняемый файл с именем hello в том же каталоге. Запуск дает то же самое, что и выше.

Первая библиотека

Теперь вместо исполняемого пакета предположим, что вы хотите создать пакет с служебной функцией, которая просто принимает входные данные и возвращает некоторые выходные данные. В этом примере мы создадим библиотеку с функцией, которая принимает имя и возвращает «Приветствую, ‹имя›!!»

В каталоге рабочей области (/Users/vinay/concisego) создайте новый каталог с именем greeting. Затем перейдите в каталог greeting.

Создайте файл welcomename.go с содержимым:

package greeting
import “fmt”
func Greet(name string) string {
    return fmt.Sprintf(“Greetings, %s!!\n”, name)
}
  • Пакет называется «приветствие» вместо «основной». Это потому, что нам нужна упакованная библиотека, а не исполняемый файл. Все файлы в этом пакете имеют одинаковое имя пакета в первой строке, которое совпадает с именем папки выше.
  • Обратите внимание, что здесь также нет функции «main()». «Приветствовать» — библиотечная функция. Он должен начинаться с верхнего регистра, чтобы быть доступным для других пакетов. «имя» — это аргумент строкового типа, объявленный в круглых скобках функции. Функция возвращает строковый тип в качестве объявленных аргументов.
  • «fmt» — это стандартный пакет GoLang. «Sprintf» — это функция в пакете «fmt», которая принимает строку формата и аргументы и возвращает отформатированную строку. В этом случае мы хотим приветствовать любое предоставленное имя, поэтому мы передаем аргумент функции имени в Sprintf(). Обратите внимание, что мы можем использовать «Sprintf», потому что оно начинается с верхнего регистра. Без этого функция была бы скрыта.

Запуск go build ничем не отличается от программы hello выше. Это потому, что нет основного пакета. Компилятор Go просто собирал, но отбрасывал результаты. Это просто будет служить проверкой того, что пакет может быть собран. Мы посмотрим, как использовать эту утилиту.

Модули

В Go есть концепция модуля. Модуль — это набор пакетов, хранящихся в файловом дереве с файлом go.mod в корне.

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

В каталоге greeting выполните следующее:

go mod init antosara.com/greeting

Это создает файл go.mod в каталоге greeting со следующим содержимым:

module antosara.com/greeting
go 1.14
  • Первая строка — имя модуля. Обычно начинается префикс пространства имен, в данном случае antosara.com или любой другой, который вы можете использовать.
  • Следующая строка — используемая версия Go.

go build по-прежнему мало что делает. Теперь давайте воспользуемся этой утилитой в нашей программе приветствия.

Перейдите в каталог concisego/hello. В файле hello.go импортируйте пакет приветствия и добавьте вызов функции Приветствие.

package main
import "fmt"
import "antosara.com/greeting"
func main() {
    fmt.Println("Hello, world.")
    fmt.Println(greeting.Greet("Vinay"))
}

Теперь беги

go build

Вы увидите ошибку:

hello.go:4:8: cannot find package "antosara.com/greeting" in any of:
/usr/local/go/src/antosara.com/greeting (from $GOROOT)
/Users/vinay/go/src/antosara.com/greeting (from $GOPATH)

Модульная система Go ожидает, что импортированный пакет будет доступен в системе контроля версий, такой как github. Если бы у нас была такая VCS на antosara.com/greeting, Go разрешил бы и импортировал пакет из этого места. Если он не может найти модуль там, Go пытается найти его в местах $GOROOT или $GOPATH. Но мы не размещали приветственный пакет в этих местах.

Чтобы решить эту проблему на данный момент, вы можете скопировать файлы go.mod и welcomename.go из каталога приветствия в $GOROOT/antosara.com/greeting или $GOPATH/antosara.com/greeting расположение выше.

Теперь в каталоге hello запустите go build. Вы должны увидеть исполняемый файл hello.

Запуск hello приведет к следующему выводу:

Hello, world.
Greetings, Vinay!!

А что, если вам нужно, чтобы hello был модулем? В каталоге hello запустите этот

go mod init antosara.com/hello

Если вы запустите go build, вы увидите ошибку:

go: finding module for package antosara.com/greeting
hello.go:5:1: cannot find module providing package antosara.com/greeting: unrecognized import path "antosara.com/greeting": reading https://antosara.com/greeting?go-get=1: 404 Not Found

Конечно, у нас нет модуля приветствия по этому URL. Мы можем решить и это. Измените содержимое go.mod на это:

module antosara.com/hello
require (
    antosara.com/greeting v0.0.0
)
replace antosara.com/greeting => ../greeting
go 1.14
  • «require» определяет зависимость от модуля приветствия. Обычно, если мы импортируем общедоступный пакет в наш файл исходного кода (hello.go), нам не нужно вручную добавлять эту зависимость в go.mod. Когда Go видит импорт, он автоматически извлекает пакет и добавляет его в go.mod.
  • «replace» направляет запрос к указанному пакету по локальному пути. В нашем случае мы указываем путь к модулю greeting относительно hello. Абсолютный путь тоже работает.

Теперь вы сможете собрать и запустить программу hello, чтобы получить ожидаемый результат.

Hello, world.
Greetings, Vinay!!

Мы изучим Go дальше в Части 2