У вас включен AdBlock или иной блокировщик рекламы.

Пожалуйста, отключите его, доход от рекламы помогает развитию сайта и появлению новых статей.

Спасибо за понимание.

В другой раз
DevGang блог о програмировании
Авторизоваться

​​Изучаем Go – Наконец-то используем модули

Помните это?

mkdir $GOTPATH/github.com/shindakun/mailgunner
mkdir $GOTPATH/github.com/shindakun/mailgunner/client

Сомневаюсь, что помните, если не читали предыдущий пост об отправке электронной почты через MailGun. Прошлый вариант немного небрежный,  и я так сделал только для того, чтобы было проще использовать пакет локально с соответствующим примером. Мне это не очень понравилось и я до сих пор не опубликовывал этот пример на GitHub из-за этого. Итак, решил, что могу написать краткий пост как же сделать mailgunner правильным модулем Go.

Подготовимся

Первое, что с чего мы начнем - создадим каталог за пределами $GOPATH. Вы можете использовать модули внутри каталога, с переменной окружения GO111MODULE = on, но, поскольку мы хотим работать вне каталога $GOPATH, мы пойдем иным путем.

mkdir ~/Code/mailgunner

Теперь создадим main.go и откроем в VS Code.

touch main.go
code .

Я заранее написал код, поэтому я просто вставляю его. Обратите внимание, что я обновил имя пакета с client на mailgunner. К тому же я добавил простенькие комментарии к экспортируемым функциям. Это даст нам некоторые преимущества, при использовании Intellisense в VS Code. Хотя, наверное, нужно сделать их немного более практичными и полезными.

Я не буду снова повторять код, просто предоставлю вам его здесь, чтобы не приходилось переходить к репозиторию или предыдущей статье. * Примечание: я немного изменил постфактум код и переименовал функцию NewMgClient в более корректную функцию New().

package mailgunner

import (
  "net/http"
  "net/url"
  "strings"
)

// MgClient struct holds our URL and API key
type MgClient struct {
  MgAPIURL string
  MgAPIKey string
  Client   *http.Client
}

// New returns our MgClient with the proper settings
func New(apiurl, apikey string) MgClient {
  return MgClient{
    apiurl,
    apikey,
    http.DefaultClient,
  }
}
// FormatEmailRequest puts everything together for sending
func (mgc *MgClient) FormatEmailRequest(from, to, subject, body string) (r *http.Request, err error) {
  data := url.Values{}
  data.Add("from", from)
  data.Add("to", to)
  data.Add("subject", subject)
  data.Add("text", body)

  r, err = http.NewRequest(http.MethodPost, mgc.MgAPIURL+"/messages", strings.NewReader(data.Encode()))
  if err != nil {
    return nil, err
  }
  r.SetBasicAuth("api", mgc.MgAPIKey)
  r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  return r, nil
}

Чтобы сделать правильный модуль, нам нужно его инициализировать.

$ go mod init github.com/shindakun/mailgunner
go: creating new go.mod: module github.com/shindakun/mailgunner

Теперь давайте настроим репозиторий Git. Если вы не знакомы с Git, рекомендую скорее начать его изучать. Pro Git доступен онлайн бесплатно.

git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/shindakun/mailgunner.git
git push -u origin master

Теперь, чтобы начать в полной мере использовать модули Go, нам нужно присвоить нашему выпуску номер версии. Мы будем следовать Semantic Versioning, пометим выпуск как версия 1 или v1.0.0 и переместим этот тег на Github.

git tag v1.0.0
git push --tags

Используем модули

Все отлично - но как мы будем это использовать? В репозитории на гите лежит пример кода. Идем дальше и клонируем репо в каталог за пределами вашей $GOPATH. Перейдем к каталогу примеров. После инициализируем его, чтобы использовать модуль. Наконец, запустим go build, выглядеть это будет примерно так:

$ go mod init example
go: creating new go.mod: module example
$ go build
go: finding github.com/shindakun/mailgunner v1.0.0
go: downloading github.com/shindakun/mailgunner v1.0.0

Посмотрите на это! Не надо больше использовать go get!

В продолжении

Я хочу немного посмотреть на веб-серверы в Go, поэтому, мы, вероятно, рассмотрим создание простых серверов. Возможно, их уровень не будет дотягивать до уровня продакшн решения, но все равно должно быть забавно размещать их в Интернете, чтобы протестить на практике. У меня были и другие идеи простеньких проектов, чтобы попробовать разные компоненты и технологии на практике. Сначала я их выучу, а потом уже, наверное, расскажу вам, посмотрим.

До встречи! 

Другие статьи из цикла:

#Golang