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

Быстрый старт с 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

«Прорывной документ»: почему новый договор России с Ираном имеет особое значение

В Сибири установили памятник Евгению Пригожину

Казань заняла 47 место среди городов России по доходности квартир при сдаче в аренду

Türkiye Today: новые власти Сирии запретили ввоз товаров из РФ, Израиля и Ирана

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

«Лукойл» планирует построить арену на 4 500 мест и Дворец спорта рядом со стадионом «Спартака»

В Новосибирске пройдет региональный отборочный тур фестиваля детского творчества «Добрая волна»

«Какого массажиста потеряла страна!» Митя Фомин рассказал Анфисе Чеховой о своих приключениях в Америке

Собянин: установили в школах станки с ЧПУ и станции для 3D-печати

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

Топ-10 новостей: центр пробации, индексирование выплат семьям, якутянки на проекте «Большие девочки»

Без декора и упаковки: как правильно сдавать хвойные деревья на переработку

Невролог Демьяновская: окунуться в прорубь следует не более чем на 10—15 секунд

Kp.ru: эскортницы рассказали, что заказчики их выбирают «по цвету и размеру»

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

Земной шар в заштопанном кармане: путешественник рассказал москвичам о странствиях по миру

Джиган сделал Оксане Самойловой сюрприз стоимостью более 22 миллионов рублей: видео

Орган. TOP 10. Величайшие сочинения

Растяжение связок: как оказать первую помощь?

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

«Сучка». Уроженка Москвы отреагировала на поражение от Касаткиной на Australian Open

Медведев проиграл 121-й ракетке мира на Australian Open

Мирра добралась до Соболенко. Нас ждет суперматч в Австралии

Коллинс ударила себя по пятой точке после матча с австралийкой. Её освистал весь стадион

Москва на Moscow.media

Эксперта, допустившего снос старинного особняка в Екатеринбурге, могут наказать

Общепиты продолжают травить людей. Новые массовые отравления в Татарстане и Красноярском крае

Неудачный разворот: в Орле столкнулись три автомобиля

ТСД SAOTRON RT41 GUN: практичный, производительный, надёжный











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

Rss.plus






Новый рекорд: цена аренды жилья в городах России выросла на 32%

Топ-10 новостей: центр пробации, индексирование выплат семьям, якутянки на проекте «Большие девочки»

Умар Нурмагомедов проиграл Мерабу Двалишвили в бою за титул чемпиона UFC

Без декора и упаковки: как правильно сдавать хвойные деревья на переработку