Golang — как я учился!

Будучи инженером по эксплуатации, я всегда работал со скриптами, но по мере перехода и принятия культуры DevOps. Я стал уделять больше времени изучению языков программирования.

Мое увлечение Go началось с путешествия terraform. Я был очарован тем, что Go создает единый бинарник для платформы и может работать без каких-либо внешних зависимостей, в отличие от python. Этого было более чем достаточно, чтобы я начал изучать этот сайт……

Лучший способ выучить язык программирования — писать на нем код

У меня было требование синхронизировать внешние репозитории GitHub с нашими внутренними репозиториями GitHub. Поэтому я решил написать код на Go.

Требования:

  1. Считать YAML: Программа должна прочитать файл YAML, который организован примерно так, как показано ниже:
RepositoryList:
  - internal_org: "internal-modules"
    internal_repo_name: "internal-aws-autoscaling-module"
    internal_repo_description: "This module helps to create autoscaling groups and corresponding launch configurations for AWS"
    github_repo_name: "terraform-aws-modules/terraform-aws-autoscaling"
    repo_tags:
      - "v3.6.0"
      - "v4.4.0"
      - "v4.5.0"
Войти в полноэкранный режим Выход из полноэкранного режима

Итак, файл YAML организован так, чтобы предоставить список репозиториев. Я использовал модуль yaml.v2, который предоставляет возможность кодировать и декодировать значения YAML.

Мне также понадобится структура данных, которая будет хранить эти значения для меня. Поэтому я использовал Golang struct для определения пользовательского type и variable для хранения данных в нем. Что-то вроде следующего

type GithubRepo struct {
 InternalOrg string `yaml:"internal_org"`
 InternalRepoName string `yaml:"internal_repo_name"`
 InternalRepoDescription string `yaml:"internal_repo_description"`
 GitHubRepoName string `yaml:"github_repo_name""`
 RepoTags []string `yaml:"repo_tags"`
}

type RepositoryList struct {
 ListOfRepositories []GithubRepo `yaml:"RepositoryList"`
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Позвольте мне немного поговорить о yaml: "internal_org", которые называются Tags. Tags — это способ прикрепить дополнительную информацию к полю struct. В Tags используется формат key:value. Это не строгое правило, а соглашение, которое обеспечивает встроенный синтаксический анализ.

Разные пакеты используют Tags по разным причинам. Мы можем использовать их в библиотеках кодирования, таких как json, xml, bson, yaml и т.д.

Теперь все, что мне нужно, это прочитать файл YAML и сохранить данные в переменной типа RepositoryList.

var yamlFile RepositoryList

f, err := os.Open("Repositories.yml")
 if err != nil {
  log.Fatalf("os.Open() failed with '%s'n", err)
 }
 defer func(f *os.File) {
  err := f.Close()
  if err != nil {

}
 }(f)

newDecoder := yaml.NewDecoder(f)
err = newDecoder.Decode(&yamlFile)
if err != nil {
  log.Fatalf("newDecoder.Decode() failed with '%s'n", err)
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Быстрый совет: никогда не забывайте закрывать файл после его чтения. Однако он может понадобиться вам снова. Чтобы избежать многократного открытия и закрытия, вы можете использовать ключевое слово defer и анонимную функцию для проверки ошибок закрытия.

2. Получение учетных данных из хранилища: Все credentials находятся в хранилище, программе необходимо получить их из vault на основе пары переменных окружения, таких как

  • VAULT_SECRET_PATH

Для этого я использовал модуль «hashicorp/vault/api».

3. Подключение к внутреннему и внешнему API GitHub: Для того чтобы получить внешний репозиторий и передать его во внутренний, мне нужно было установить соединение как с внешним, так и с внутренним. Для этого я использовал модуль «github».

4. Сделайте что-нибудь с данными: Теперь у меня есть данные, сохраненные в переменной yamlFile, у меня есть GitToken из Vault. Пришло время получить доступ к данным по отдельности и что-то с ними сделать. Доступ к данным можно получить примерно так: Поскольку это List, я могу выполнять итерации по нему и хранить кусок данных во временной переменной цикла v.

for _, v := range yamlFile.RepositoryList {
  // Now I can access the content individually
  // and do something about it
  fmt.Println(v.InternalOrg)
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Все данные, считанные из файла YAML теперь могут быть доступны под v.<<FieldName>>. Что-то вроде этого

v.InternalOrg , v.InternalRepoName , v.GitHubRepoName , v.RepoTags и т.д.

Выводы

С помощью этого упражнения я смог узнать довольно много нового, вот некоторые из них:

  • Go Structs
  • Go Structs Tags
  • Go DataTypes
  • Как использовать внешние модули
  • Чтение файлов
  • Кодирование и декодирование данных YAML
  • Доступ к данным с помощью FieldName

Изучение нового языка программирования — это всегда весело, а когда вы выбираете что-то, что можно построить рядом, то это становится еще более увлекательным и интересным!

Счастливого кодинга!!!

Оцените статью
devanswers.ru
Добавить комментарий