悠悠楠杉
怎样用Golang开发一个天气查询CLI调用公开API的完整流程
标题:用Golang打造高效天气查询CLI工具:从API调用到终端交互全指南
关键词:Golang, CLI工具, 天气API, 终端应用, 开发教程
描述:本文详细介绍如何用Golang开发一个基于公开API的天气查询命令行工具,涵盖API选择、请求处理、JSON解析和用户交互设计全流程,提供完整可运行的代码示例。
正文:
在终端爱好者眼中,命令行工具(CLI)是效率的代名词。今天我们将用Golang构建一个能实时查询天气的CLI工具,整个过程就像组装乐高积木——把API调用、数据处理和用户界面完美拼接起来。
第一步:选择合适的天气API
市面上免费的天气API不少,我们选用和风天气(dev.qweather.com)的免费版,它提供每小时级更新且支持中文地理位置。注册后获取API Key(记得选免费开发者套餐),这个密钥相当于我们访问天气数据的"通行证"。
第二步:搭建项目骨架
用Go Modules初始化项目:
mkdir weather-cli && cd weather-cli
go mod init github.com/yourname/weather-cli创建main.go作为入口文件,同时新建一个api包存放核心逻辑。这种分层结构让代码更易维护——就像把衣服分类收纳,找起来特别顺手。
第三步:封装API请求
在api/weather.go中,我们构造HTTP请求并处理响应。注意加入超时控制,避免网络卡顿导致程序"假死":
func FetchWeather(city, apiKey string) ([]byte, error) {
client := http.Client{Timeout: 10 * time.Second}
url := fmt.Sprintf("https://devapi.qweather.com/v7/weather/now?location=%s&key=%s", city, apiKey)
resp, err := client.Get(url)
if err != nil {
return nil, fmt.Errorf("请求失败: %v", err)
}
defer resp.Body.Close()
return io.ReadAll(resp.Body)
}第四步:解析JSON数据
天气API返回的JSON数据像多层嵌套的俄罗斯套娃。定义结构体时要注意字段对应关系:
type WeatherResponse struct {
Now struct {
Temp string `json:"temp"`
FeelsLike string `json:"feelsLike"`
Text string `json:"text"`
WindDir string `json:"windDir"`
} `json:"now"`
}解析时使用json.Unmarshal,就像把杂乱的文件归档到标签明确的文件夹中。
第五步:设计终端交互
好的CLI应该像贴心的服务员——清晰告知用户需要什么。我们使用cobra库构建命令系统:
var rootCmd = &cobra.Command{
Use: "weather",
Short: "实时天气查询工具",
Run: func(cmd *cobra.Command, args []string) {
if len(args) == 0 {
fmt.Println("请输入城市名称")
return
}
// 调用API处理逻辑...
},
}加上颜色输出让信息更醒目,就像用荧光笔标记重点:
fmt.Printf("\033[1;36m当前温度: %s℃\033[0m\n", weather.Now.Temp)第六步:处理边界情况
健壮的程序要像老司机一样预见各种意外:
- 城市不存在时显示友好提示
- API调用次数超限时切换备用方案
- 网络中断时自动重试2次
完整组装
最终效果就像瑞士军刀——小巧但功能完备:
./weather 北京
🌞 北京天气实况
温度:28℃(体感30℃)
天气:晴
风向:东南风3级通过这个项目,你不仅学会了API调用和CLI开发,更重要的是掌握了如何把分散的技术点串联成实用工具。下次可以尝试加入天气预报、空气质量检测等功能,让你的命令行工具更加全能。
