DevGang
Авторизоваться

Пишем первый проект на 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.

#Golang
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

Напиши статью и выиграй годовую подписку на Яндекс плюс или лицензию от Jet Brains

Участвовать