Совсем другая книга про Go

Совсем другая книга про Go #

Введение #

“Маленькие книги” Карла Сегуина это лучший формат для быстрого входа - все самое важное, без подробностей. Детали, в которых так легко утонуть, легко добываются потом, когда общая картина уже сложилась и дыры в ней, требующие заполнения, тоже видны. Остается лишь задавать правильные вопросы.

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

Все меняется, в случае с Go - меняется драматически. Модули в обновленном Go настолько отличаются, что написать программу сложнее пресловутого HelloWorld уже невозможно. И с этим надо что-то срочно делать.

Начав однажды писать, трудно остановится и я решил во всем разобраться и записать. Это будет совсем другая книга про Go. Как всегда, эти записи я делаю для самого себя. Если кому-то еще от них будет польза… что же, это будет лучшим применением сил и потраченного времени.

Не судите строго.

Совсем другая? #

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

Забегая вперед #

Первая программа #

Здесь все по классике.

Создайте файл hello.go:

package main
import "fmt"

func main() {
    fmt.Println("Hello, world!")
}

Запустите:

$ go run hello.go
Hello, world!

Или скомпилируйте:

$ go build hello.go
$ ./hello
Hello, world!

Вот, в общем-то и все. Скомпилированная программа это двоичный исполняемый файл для вашей операционной системы - Windows, Linux, MacOS. Собрать программу можно из одной операционной системы для другой, но это детали.

Модули #

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

В первой строке объявляется имя модуля. Во второй строке импортируется содержимое модуля fmt. Этот модуль - часть стандартной библиотеки, отвечающей за форматированный ввод и вывод. В нем содержится функция Println, которую мы использовали в первой программе. Функции из модуля вызываются с указанием имени модуля - fmt.Println.

И еще. Println записано с большой (прописной) буквы не для красоты. Это еще одна важная деталь - функции, которые доступны извне, пишутся с большой буквы, а функции, доступные только внутри модуля, с маленькой.

Среда окружения #

Весь Go это один исполнимый файл. Любое действие - запуск, компиляция, форматирование, настройка - это запуск файла go с нужными параметрами. И все в Go управляется переменными окружения.

Все переменные можно увидеть.

$ go env
...
GOROOT='/usr/lib/go'
GOPATH='/home/iam/go'
...

Среди прочих, в переменных окружения есть GOROOT и GOPATH - важнейшие их них. Они указывают на директории, где в поддиректории src хранится код всех библиотек - встроенных и внешних.

Раньше, собственные модули приходилось сохранять в $GOPATH/src. Но не теперь.

Модули нового поколения #

А теперь по порядку #