Python转Golang指南:代码转换实践与技巧
Python转Golang指南:代码转换实践与技巧 我需要将这段Python代码转换为Go语言,请帮忙。
import requests
def api():
response = requests.get("https://reqres.in/api/users?page=1").json()
print("Page : ",response["page"])
print("Per_page : ",response["per_page"])
print("total: ",response["total"])
print("total_pages",response["total_pages"])
data = (response["data"])
for i in data:
print("id : "," ",i["id"]," ","Email : ",i["email"]," ","First Name : ",i["first_name"],"Last Name : "," ",i["last_name"]," ","Avatar: ",i["avatar"],"\n")
avatars = i["avatar"]
avatar_name = (avatars[28:])
contentR = requests.get(avatars)
with open(i["first_name"]+" "+i["last_name"]+" "+avatar_name,"wb") as f:
f.write(contentR.content)
api()
更多关于Python转Golang指南:代码转换实践与技巧的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
你好,
问题在于你是否理解这段Python代码做了什么。 简而言之,它:
- 向一个服务发起GET请求
- 打印一些信息
- 遍历结果
- 下载头像并保存到磁盘。
到目前为止你尝试了什么?
更多关于Python转Golang指南:代码转换实践与技巧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码看起来像一个REST端点,你可能需要在Go语言中使用以下一个或多个包来实现:
- “net/http” 用于 REST请求/响应
- “html/template” 用于类似Flask/jinja的模板
- “github.com/gorilla/mux” 用于REST路由器
- “encoding/json” 用于解析JSON请求和生成JSON响应
- “io/ioutil” 用于更简便的读写操作
由于不清楚消息部分的类型,你可以尝试用例如以下方式解析响应:
req, err := http.NewRequest("GET", "https://reqres.in/api/users?page=1", nil)
if err != nil {
fmt.Println("Error is req: ", err)
}
// 创建一个客户端
client := &http.Client{}
// Do发送一个HTTP请求
resp, err := client.Do(req)
if err != nil {
fmt.Println("error in send req: ", err)
}
respBody, _ := ioutil.ReadAll(resp.Body)
var respMap map[string]interface{}
json.Unmarshal(respBody,&respMap)
log.Printf("response=%v",respMap)
以下是等效的Go语言实现,包含HTTP请求、JSON解析和文件下载功能:
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"strings"
)
type APIResponse struct {
Page int `json:"page"`
PerPage int `json:"per_page"`
Total int `json:"total"`
TotalPages int `json:"total_pages"`
Data []User `json:"data"`
}
type User struct {
ID int `json:"id"`
Email string `json:"email"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
Avatar string `json:"avatar"`
}
func main() {
api()
}
func api() {
// 发送HTTP GET请求
resp, err := http.Get("https://reqres.in/api/users?page=1")
if err != nil {
fmt.Printf("请求失败: %v\n", err)
return
}
defer resp.Body.Close()
// 解析JSON响应
var apiResp APIResponse
decoder := json.NewDecoder(resp.Body)
if err := decoder.Decode(&apiResp); err != nil {
fmt.Printf("JSON解析失败: %v\n", err)
return
}
// 打印基本信息
fmt.Printf("Page: %d\n", apiResp.Page)
fmt.Printf("Per_page: %d\n", apiResp.PerPage)
fmt.Printf("Total: %d\n", apiResp.Total)
fmt.Printf("Total_pages: %d\n", apiResp.TotalPages)
// 处理每个用户数据
for _, user := range apiResp.Data {
fmt.Printf("ID: %d Email: %s First Name: %s Last Name: %s Avatar: %s\n\n",
user.ID, user.Email, user.FirstName, user.LastName, user.Avatar)
// 下载头像
if err := downloadAvatar(user); err != nil {
fmt.Printf("下载头像失败 (用户 %s %s): %v\n", user.FirstName, user.LastName, err)
}
}
}
func downloadAvatar(user User) error {
// 获取头像URL的最后部分作为文件名
avatarURL := user.Avatar
avatarName := avatarURL[strings.LastIndex(avatarURL, "/")+1:]
// 下载头像
resp, err := http.Get(avatarURL)
if err != nil {
return err
}
defer resp.Body.Close()
// 创建文件
fileName := fmt.Sprintf("%s %s %s", user.FirstName, user.LastName, avatarName)
file, err := os.Create(fileName)
if err != nil {
return err
}
defer file.Close()
// 写入文件
_, err = io.Copy(file, resp.Body)
if err != nil {
return err
}
fmt.Printf("已下载: %s\n", fileName)
return nil
}
关键转换点说明:
- HTTP请求:使用
net/http包替代requests库 - JSON处理:定义结构体并使用
encoding/json包进行序列化 - 错误处理:Go要求显式处理所有可能的错误
- 资源管理:使用
defer确保正确关闭响应体和文件 - 字符串处理:使用
strings.LastIndex替代Python的切片操作
需要安装依赖:
go mod init your_module_name
此实现包含了完整的错误处理,确保程序在遇到网络问题或文件系统错误时能优雅地处理。

