Этот CLI-инструмент позволяет получать прогноз погоды для указанного города или текущего местоположения пользователя.
- Убедитесь, что у вас установлен Go (версия 1.16 или выше).
- Склонируйте репозиторий:
git clone https://github.com/Mazurchik-Marta/go-demo-5 cd go-demo-5
- Соберите исполняемый файл:
go build -o go-demo-5
./go-demo-5 -city "Moscow" -format 2
./go-demo-5 -format 1
-city
(строка) – Название города, для которого необходимо получить прогноз погоды.-format
(целое число) – Формат вывода прогноза погоды (1, 2, 3). Значения соответствуют параметрам API wttr.in:1
– краткий прогноз2
– подробный прогноз3
– прогноз с иконками
- Если указан город, выполняется проверка его существования с помощью внешнего API.
- Если город не указан, определяется местоположение пользователя с помощью
ipapi.co
. - Полученные геоданные передаются в API
wttr.in
для получения прогноза погоды. - Прогноз погоды выводится в указанном формате.
- Также проверка локации осуществляется через сервис
countriesnow.space/api/v0.1
Функция main
в данном коде выполняет следующие шаги:
city := flag.String("city", "", "Город пользователя")
format := flag.Int("format", 1, "Формат вывода погоды")
Здесь используются функции пакета flag
, которые позволяют получать аргументы командной строки:
flag.String("city", "", "Город пользователя")
- Определяет флаг
-city
(например,-city Moscow
). - Значение по умолчанию — пустая строка
""
. city
— это указатель на строку (*string
).
- Определяет флаг
flag.Int("format", 1, "Формат вывода погоды")
- Определяет флаг
-format
(например,-fotmat 2
). - Значение по умолчанию —
1
. format
— это указатель наint
(*int
).
- Определяет флаг
flag.Parse()
Функция flag.Parse()
анализирует переданные аргументы и присваивает значения переменным city
и fotmat
.
Например, если запустить программу так:
go run main.go -city Moscow -fotmat 2
то *city
будет "Moscow"
, а *fotmat
— 2
.
fmt.Println(*city)
*city
разыменовывает указатель и выводит название города в консоль.- Если флаг
-city
не был передан, выводится пустая строка""
.
geoData, err := geo.GetMyLocation(*city)
if err != nil {
fmt.Println(err.Error())
}
- Функция
geo.GetMyLocation(*city)
получает данные о местоположении по названию города. - Если происходит ошибка (
err != nil
), она выводится в консоль.
fmt.Println(geoData)
- В консоли отображаются полученные данные о местоположении (
geoData
).
weatherData, _ := weather.GetWeather(*geoData, *fotmat)
- Вызывается функция
weather.GetWeather
, которая получает погоду по геоданным и формату. - Ошибка игнорируется (
_
вместо обработки).
fmt.Println(weatherData)
- Выводит информацию о погоде в консоль.
NOCITY
– Город не найден или указан неверно.NOT200
– Ошибка ответа от API определения местоположения.ERROR_WRONG_FORMAT
– Указан некорректный формат прогноза.ERROR_URL
– Ошибка формирования URL для запроса к API.ERROR_HTTP
– Ошибка сетевого запроса.ERROR_ReadBody
– Ошибка чтения ответа API.
net/http
– для выполнения HTTP-запросов.encoding/json
– для обработки JSON-ответов.flag
– для обработки аргументов командной строки.
Пакет weather
предоставляет функцию для получения прогноза погоды с сервиса wttr.in.
Использует географические данные и позволяет запрашивать прогноз в разных форматах.
Пакет geo
предоставляет функции для определения местоположения пользователя по IP и проверки существования города через API.