Совсем другая книга про 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
. Но не теперь.
Модули нового поколения #
А теперь по порядку #
…