Добавить новость
Другие новости Москвы и Московской области на этот час
Добавь свою новость бесплатно - здесь

Быстрый старт с Go: сканер погоды

Продолжаем знакомиться с языком Go. В этот раз напишем программу, способную читать в интернете данные о погоде, — своего рода сканер погоды. Предварительно рекомендую прочитать статью «Быстрый старт с Go: первые шаги» — для нашей сегодняшней задачи вам потребуется знать основы языка, а также скачать и установить компилятор Go.

План работы над нашим сканером таков:

  • используем сайт, который выдаёт прогноз погоды в формате XML,
  • прочитаем оттуда данные по погоде средствами Go,
  • преобразуем их в удобный для обработки формат,
  • выберем то, что нам необходимо.

Настраиваем источник информации

Мы воспользуемся сайтом «Метеосервис», который позволяет получать информацию о погоде в выбранной стране и указанном городе. Чтобы получить нужную ссылку, переходим на страницу настройки сервиса. Выберем из списков страну и город — например, Россию и Москву. В результате чуть ниже, после слов «Местоположение сервиса», видим ссылку: https://xml.meteoservice.ru/export/gismeteo/point/32277.xml. Этот адрес возвращает в XML-формате информацию о погоде в выбранном городе. Его можно даже просто открыть в браузере. Ещё на странице настройки сервиса есть описание структуры получаемых данных.

Читаем данные с сайта

Для чтения данных по полученной ссылке используем GET-запрос по протоколу HTTP. Для отправки запросов в Go в пакете net/http определено несколько функций, по одной на каждый вид запроса. Нам нужна функция Get().

В качестве параметра она принимает адрес ресурса, к которому надо выполнить запрос, и возвращает объект http.Response, содержащий ответ сервера. Как и все функции, связанные с вводом-выводом, Get() вернёт ошибку, если она возникнет. 

Фрагмент кода с использованием Get() и обработкой ошибок будет выглядеть так:

Последняя строка фрагмента содержит команду отложенного закрытия потока Body. Не забываем при этом импортировать соответствующие пакеты:

Поле Body структуры http.Response представляет собой ответ от веб-ресурса и при этом является интерфейсом io.ReadCloser. Фактически это поле — поток для чтения, и его можно прочесть как массив байт, используя функцию ReadAll() пакета io/ioutil. Применим для этого следующий код, не забыв импортировать соответствующий пакет:

Результат можно легко вывести, к примеру, в консоль, преобразовав массив байт в строку:

Формат данных XML и структуры

XML (eXtensible Markup Language) — это расширяемый язык разметки. В отличие от языка гипертекстовой разметки HTML, который содержит ограниченный набор тегов, XML позволяет разработчику использовать собственные теги.

В пакет библиотеки Go encoding/xml входят функции, позволяющие работать с XML. Нам потребуется функция xml.Unmarshall, преобразующая XML-данные в соответствующую структуру.

Структуры в Go — это специальный тип данных, определяемый разработчиком и служащий для описания какого-либо объекта. Структуры содержат набор полей, которые представляют различные атрибуты объекта. Для определения структуры применяются ключевые слова type и struct. Каждое поле имеет имя и тип, как переменная.

Предложенная выше структура, к примеру, описывает человека. Её имя — person. Она содержит два поля: name (имя человека, представляет тип string) и age (возраст человека, представляет тип int).

Распаковываем XML в структуру

Полученные с сайта XML-данные необходимо распаковать в структуру, имеющую поля, соответствующие тегам в наших данных. Создадим её с помощью онлайн-инструмента. Вводим адрес, по которому читаем XML, в строку — и нажимаем кнопку Get from URL. Или копируем полученный XML в левое окно. При этом в правом окне генерируется соответствующая структура на Go. Копируем её в свой код. Рекомендую внимательно изучить её поля и увидеть их соответствие XML-данным.

Затем объявляем переменную, типом которой будет наша структура. В эту переменную распаковываем полученные из интернета данные в формате XML, используя функцию xml.Unmarshal().

Выбираем информацию из структуры

После распаковки переменная weather содержит в виде структуры данные, которые мы получили в формате XML. Для обращения к полям структуры используется точка. К примеру, чтобы вывести значения поля Sname, которое содержит название города, нужно написать:

То есть обратиться к полю Sname структуры TOWN, которая является полем структуры REPORT, выступающей в свою очередь полем переменной weather. Кроме того, нужно использовать функцию url.PathUnescape(), чтобы раскодировать значение этого поля. И не забыть при этом импортировать пакет net/url.

А если, к примеру, мы хотим получить все значения прогнозируемой максимальной температуры, достаточно использовать следующий фрагмент кода:

Если нужно уточнить дату и время прогноза, достаточно добавить следующую строку в тело цикла:

Исследуя полученные XML и структуры, мы видим, что данные содержат также информацию о давлении, направлении, силе ветра и так далее. Чтобы поупражняться, можно попробовать вывести в консоль и эту информацию.

Заключение

Если у вас всё получилось — поздравляю! Если нет и возникли вопросы — пишите, спрашивайте, не стесняйтесь. Меня можно найти в Telegram под ником @biblelamp или на сайте GeekBrains. Желаю всем удачи и рекомендую никогда не останавливаться в изучении программирования.

Дополнительные материалы по Go для начинающих:

Первая часть цикла о Go-разработке:

Хотите получить системную подготовку? На факультете Go-разработки GeekUniversity вы за полтора года приобретёте все знания, необходимые для начала карьеры Go-разработчика, создадите собственное портфолио из нескольких работ и получите работу по специальности.

Читайте на 123ru.net


Новости 24/7 DirectAdvert - доход для вашего сайта



Частные объявления в Москве, в Московской области и в России



Smi24.net — ежеминутные новости с ежедневным архивом. Только у нас — все главные новости дня без политической цензуры. "123 Новости" — абсолютно все точки зрения, трезвая аналитика, цивилизованные споры и обсуждения без взаимных обвинений и оскорблений. Помните, что не у всех точка зрения совпадает с Вашей. Уважайте мнение других, даже если Вы отстаиваете свой взгляд и свою позицию. Smi24.net — облегчённая версия старейшего обозревателя новостей 123ru.net. Мы не навязываем Вам своё видение, мы даём Вам срез событий дня без цензуры и без купюр. Новости, какие они есть —онлайн с поминутным архивом по всем городам и регионам России, Украины, Белоруссии и Абхазии. Smi24.net — живые новости в живом эфире! Быстрый поиск от Smi24.net — это не только возможность первым узнать, но и преимущество сообщить срочные новости мгновенно на любом языке мира и быть услышанным тут же. В любую минуту Вы можете добавить свою новость - здесь.




Новости от наших партнёров в Москве

Ria.city

Штрафы за незаконную уличную торговлю ввели в Подмосковье

Акции перевелись в третий эшелон // Как инвесторы будут работать с бумагами не завершивших процесс редомициляции компаний

В Рославльском районе произошёл большой пожар

В Роскачестве дали советы по выбору сладкого новогоднего подарка для ребёнка

Музыкальные новости

Чудак-американец хочет стать русским, а в «Спартаке» новый канадец. Трансферы и слухи КХЛ

Сервисное локомотивное депо «Иваново» филиала «Северный» ООО «ЛокоТех-Севрис» выпустило из среднего ремонта 25-й локомотив серии 2ТЭ116УД.

Безопасность спортивных и культурных мероприятий в Зауралье обеспечила Росгвардия

"Динамо" - самый пострадавший от судей клуб в первой части РПЛ

Новости Москвы

Непатриотичное поведение: жильцы краснодарского ЖК воюют с УК «Патриот»

Путин наградил главврача МГКБ Лысенко орденом «За заслуги перед Отечеством»

В Рославльском районе произошёл большой пожар

Инвестора ФК «Химки» Садыгова обвиняют в крупном мошенничестве

Экология в Москве

Зимний фестиваль «Усадьбы Москвы»

Как отрастить крепкие, здоровые и красивые ногти в домашних условиях: 10 элементарных действий

Меньше света – больше аппетит! Диетолог Садыков назвал причины набора веса зимой

Кабинет Артиста в Яндекс. Кабинет Артиста в Яндекс Музыке. 

Спорт в Москве

Арина Соболенко получила награду WTA за преданность делу и продвижение женского тенниса

Полина Кудерметова проиграла в первом круге турнира WTA-125 в Лиможе

Раскрыта неожиданная причина превосходства молодой теннисистки над Еленой Рыбакиной

Новак Джокович назвал знаковый финал Уимблдона самым нервным матчем в карьере

Москва на Moscow.media

В Тюменской области продолжат строительство крупных дорожных объектов в 2025 году

Портативный ТСД корпоративного класса Saotron RT-T70

• Dusil Photography • https://dusil.org

Движение перекрыто в районе Коптевского рынка в Москве из-за пожара











Топ новостей на этот час в Москве и Московской области

Rss.plus






ВЦИОМ: 27% российских граждан считают хоккей национальным видом спорта

Доставку биоматериалов в лабораторной службе Москвы цифровизировали

Инвестора ФК «Химки» Садыгова обвиняют в крупном мошенничестве

В Роскачестве дали советы по выбору сладкого новогоднего подарка для ребёнка