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代码做了什么。 简而言之,它:

  1. 向一个服务发起GET请求
  2. 打印一些信息
  3. 遍历结果
  4. 下载头像并保存到磁盘。

到目前为止你尝试了什么?

更多关于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
}

关键转换点说明:

  1. HTTP请求:使用net/http包替代requests库
  2. JSON处理:定义结构体并使用encoding/json包进行序列化
  3. 错误处理:Go要求显式处理所有可能的错误
  4. 资源管理:使用defer确保正确关闭响应体和文件
  5. 字符串处理:使用strings.LastIndex替代Python的切片操作

需要安装依赖:

go mod init your_module_name

此实现包含了完整的错误处理,确保程序在遇到网络问题或文件系统错误时能优雅地处理。

回到顶部