Пишем первый проект на Golang
Пару месяцев назад я начал писать на Go так же известным, как Golang. И не только из-за их потрясающего логотипа. Основная причина была в том, что я хотел, чистую железяку на моем Raspberry Pi, а так же кроссплатформенность в паре с легкостью установки. Среди других причин были простота создания на Go асинхронного кода с помощью Go методов и уникальный подход к синхронизации каналов между подпрограммами (потоками) посредствам go routines.
С тех пор, как GO был выпущен в 2012 году, я много читал о нем и что ж, пришло время по-настоящему замарать руки и попробовать использовать его для своих задач.
Однако любопытно, продолжим ...
Что же из себя представляет GO?
Go - это опен сорсный язык программирования , который позволяет легко создавать простое, надежное и эффективное программное обеспечение. Разрабатывался он внутри компании Google и на 2018 год уже являлся одним из самых быстроразвивающихся и адаптированных языков программирования. Первый релиз языка появился в марте 2012 года. А не так давно, начиная с выпуска Go 1.11, у него появилась поддержка модулей и управлять зависимостями стало немного удобнее.
Необходимые настройки среды
Для начала нужно все правильно настроить. Есть простой способ установить мою библиотеку с помощью Chocolatey.
В Windows мы используем Chocolatey в Powershell для установки Go и vscode…
Windows Powershell as administrator cinst -y go vscode
С установленным Go и vscode у нас есть все, что нужно для начала.
Так как я использую Git bash на все случаи жизни, я запускаю следующую команду Visual Studio Code из Git Bash, чтобы установить go расширение. Если хотите, вы можете просто установить расширение из самого vscode.
Windows Git Bash code --install-extension ms-vscode.go
Вот мы и поставили Go расширение в visualstudio, так что теперь у нас есть все для приятного кодинга.
Где найти отличные ресурсы и материалы по GO?
Документацию по Go можно найти здесь. Все пакеты, доступные для использования, можно найти здесь.Кроме того, для того, чтобы заюзать Go или помочь другим программистам с примерами у языка есть онлайн-площадка.
Создаем первый проект
Для того, чтобы начать на Go новый проект, мы сначала создаем пустую папку. Затем мы прописываем в этой папке команду go modules init, чтобы инициализировать модули Go. Модули используются для зависимостей.
mkdir hello-world cd hello-world go mod init github.com/marcofranssen/hello-world
Синтаксис
В Go мы определяем функцию, используя ключевое слово func.
func main() { // our code }
То, что других языках обычно бывает классом, в Go является структурой struct. Вы можете определить структуру следующим образом.
type Envelope struct { Message string }
Все переменные, функции, структуры, которые начинаются с верхнего регистра в Go являются публичными. А все переменные, функции, структуры, начинающиеся со строчной буквы, являются частными. Кроме того, как вы наверное уже заметили в примере, определения типов идут за именем переменной. Поместив оператор импорта поверх файла вы можете импортировать все необходимые пакеты. И последнее, но не менее важное: каждая программа go должна иметь хотя бы один main пакет.
package main import "fmt" func SayHi(person string) string { //public function return fmt.Sprintf("Hi %s", person) } func sayHi(person string) string { //private function return fmt.Sprintf("Hi %s", person) }
Этот пакет fmt предоставляет нам несколько полезных функций, например строки шаблонов, которые удобно использовать для построения строки с использованием некоторых переменных.. Более того, в примере мы видим, что возвращаемый тип для функции упоминается в конце ее определения. Более подробно читайте о пакете fmt в документации.
Вперед, в бой!
Теперь у нас есть пустой проект, и к тому же мы уже немного знаем о синтаксисе, чтож, начнем! Открываем эту папку в vscode.
code .
Сначала мы добавляем новый файл в нашу папку, называем ее main.go . Затем добавим тот код, который мы рассмотрели выше.
package main import "fmt" func main() { fmt.Println(sayHi("Marco")) } func sayHi(person string) string { return fmt.Sprintf("Hi %s", person) }
Теперь с помощью этого кода мы можем запустить наше приложение. Используя следующую команду в командной строке.
go run main.go
Можете также прогнать этот код в Go playground.
Тестирование
Чтобы добавить тесты в go, просто добавьте файл main_test.go. Добавим функцию проверяющую метод sayHi. Сигнатура методов тестирования всегда ДОЛЖНА быть TestXxx(t *testing.T). Первый X всегда должен быть в верхнем регистре.
package main import "testing" func TestSayHi(t *testing.T) { expected := "Hi Marco" greeting := sayHi("Marco") if greeting != expected { t.Errorf("Greeting was incorrect, got: '%s', want: '%s'", greeting, expected) } }
Вы наверняка заметили что то новое в этом коде. Мы используем сокращение для присвоения значений переменной: =. Если функция sayHi не возвращает ожидаемое нами значение, мы выдадим ошибку с хорошим понятным сообщением.
Теперь, чтобы запустить наш тест, мы сделаем в командной строке следующее. Обратите внимание, что я запускаю все тесты из всех файлов и подпапок в моем проекте таким способом ./...
go test ./...
Пожалуйста, не бойтесь пробовать, изменяйте реализацию, и снова запустите тест, чтобы увидеть, как тесты пройдут неудачно. Для запуска с code coverage запустите такие тесты.
go test -coverage -coverprofile=coverage.out ./... go tool cover -html=coverage.out -o coverage.html
Чтобы подробнее ознакомится, пожалуйста, читайте документацию о testing package.
Компилируем и выполняем
Самым простым способом создать исполняемый файл будет:
go build . ./hello-world.exe
Это команда создаст нам исполняемый файл Windows, как будто мы на Windows. Вы можете просто вызвать исполняемый файл и увидеть тот же результат, что мы имели при вызове go run main.go. Если мы хотим получить более подробный вывод и посмотреть, что происходит за под капотом, можно использовать -x опцию -в go build. А как нам скомпилировать один и тот же код для Linux или Raspberry Pi?
GOOS=linux GOARCH=amd64 go build .
Чтобы запустить этот бинарник в Linux, не забудьте использовать chmod +x, а затем просто вызвать с помощью ./hello-world
Raspberry Pi 3 имеет архитектуру ARM v7, которую можно скомпилировать следующим образом. ПРИМЕЧАНИЕ: все это мы можем сделать с Windows.
GOOD=linux GOARCH=arm GOARM=7 go build .
Для запуска бинарника сделайте все то же самое, что и на любом другом компьютере с Linux chmod +x, а затем ./hello-world для запуска вашего приложения.
Резюмируя
Я знаю, что это очень простое приложение и оно не несет практической пользы, но, по крайней мере, вы уже, как минимум, настроили свою среду разработки и приобрели небольшой практический опыт в написании первых строк кода на Go. Вы уже также знаете, как писать тесты. Это будет хорошей основой для написания качественного кода. Более интересные вещи, такие как go routines, я хотел бы оставить для нового поста в блоге.
И последнее, но не менее важное: я хотел бы поделиться с вами своим первым приложением на Go. Это интеграция с термостатом Nest, который я запускаю на своем Raspberry Pi, чтобы собрать данные о температуре и отобразить их в хорошем веб-приложении на React. Только не забудьте зарегистрироваться в рабочем пространстве Gophers Slack.