Go语言实战 | 豆包MarsCode AI 刷题

66 阅读7分钟

命令行实现词典

命令行版本词典实现:调用第三方api实现

1.抓包在线词典:fanyi.caiyunapp.com/ 打开后查看network请求,json的post

{725E88FA-D8F0-443D-8602-13D4F3EEEE6F}.png

生成请求:利用curl工具返回json并打印

2.curlconverter.com/#go 包括创建请求,设置请求头,发起请求,读取响应 首先复制post为curl命令 headers=@"UserAgent"="Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:132.0)Gecko/20100101Firefox/132.0""Accept"="application/json,text/plain,/""AcceptLanguage"="zh""AcceptEncoding"="gzip,deflate,br,zstd""ContentType"="application/json;charset=utf8""XAuthorization"="token:qgemv4jr1y38jyq6vhvi""appname"="xiaoyi""version"="4.6.0""ostype"="web""osversion"="""deviceid"="0d318170e4b5e08ae837d97f5c7b22d6""authorization"="bearer""Origin"="https://fanyi.caiyunapp.com""Referer"="https://fanyi.caiyunapp.com/""SecFetchDest"="empty""SecFetchMode"="cors""SecFetchSite"="crosssite""TE"="trailers"headers = @{ "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0" "Accept" = "application/json, text/plain, */*" "Accept-Language" = "zh" "Accept-Encoding" = "gzip, deflate, br, zstd" "Content-Type" = "application/json;charset=utf-8" "X-Authorization" = "token:qgemv4jr1y38jyq6vhvi" "app-name" = "xiaoyi" "version" = "4.6.0" "os-type" = "web" "os-version" = "" "device-id" = "0d318170e4b5e08ae837d97f5c7b22d6" "authorization" = "bearer" "Origin" = "https://fanyi.caiyunapp.com" "Referer" = "https://fanyi.caiyunapp.com/" "Sec-Fetch-Dest" = "empty" "Sec-Fetch-Mode" = "cors" "Sec-Fetch-Site" = "cross-site" "TE" = "trailers" } body = '{"trans_type":"en2zh","source":"good"}' Invoke-WebRequest -Uri "api.interpreter.caiyunai.com/v1/dict" -Method POST -Headers headersBodyheaders ` -Body body ` -ContentType "application/json"

得到返回值 StatusCode : 200 StatusDescription : OK Content : {"rc":0,"wiki":{},"dictionary":{"prons":{"en-us":"[g\u028ad]","en":"[gud]"},"explanations":["a.\u59 7d\u7684;\u5584\u826f\u7684;\u5feb\u4e50\u7684;\u771f\u6b63\u7684;\u5bbd\u5927\u7684;\u6709\u76ca\u 76... RawContent : HTTP/1.1 200 OK Transfer-Encoding: chunked Connection: keep-alive Access-Control-Allow-Origin: fanyi.caiyunapp.com Access-Control-Allow-Credentials: true Vary: Origin Content-Encoding: g... Forms : {} Headers : {[Transfer-Encoding, chunked], [Connection, keep-alive], [Access-Control-Allow-Origin, https://fany i.caiyunapp.com], [Access-Control-Allow-Credentials, true]...} Images : {} InputFields : {} Links : {} ParsedHtml : mshtml.HTMLDocumentClass RawContentLength : 1466

通过json序列化来读取可变输入,转化到data字段;解析response并提取特定字段

fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs) for _, item := range dictResponse.Dictionary.Explanations { fmt.Println(item) } }使用range循环把需要的字段打印出来

涉及知识点

1. HTTP 请求

使用 net/http 包创建和发送 HTTP 请求,设置请求头和请求体

net/http 包是 Go 标准库中用于处理 HTTP 请求和响应的核心组件。通过这个包,你可以轻松地创建和发送 HTTP 请求,从远程服务器获取数据。

关键步骤

  1. 导入包

    go
    深色版本
    import (
        "net/http"
        "io/ioutil"
        "strings"
    )
    
  2. 创建请求

    • 使用 http.NewRequest 函数创建一个新的 HTTP 请求对象。你需要指定请求方法(如 POST)、目标 URL 和请求体。请求体通常是一个字符串或字节切片,可以通过 strings.NewReader 转换为 io.Reader 类型。
    go
    深色版本
    req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", strings.NewReader(body))
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }
    
  3. 设置请求头

    • 使用 req.Header.Set 方法设置请求头。请求头用于传递额外的信息,如用户代理(User-Agent)、内容类型(Content-Type)等。这些头信息对于服务器正确处理请求至关重要。
    go
    深色版本
    req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0")
    req.Header.Set("Content-Type", "application/json;charset=utf-8")
    
  4. 发送请求

    • 使用 http.Client 对象发送请求。http.Client 是一个高效的 HTTP 客户端,可以复用连接以提高性能。通过 client.Do(req) 发送请求,并读取响应体。使用 defer resp.Body.Close() 确保在请求完成后关闭响应体,释放系统资源。
    go
    深色版本
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error sending request:", err)
        return
    }
    defer resp.Body.Close()
    
    respBody, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response body:", err)
        return
    }
    

2. JSON 解析

使用 encoding/json 包定义结构体并解析 JSON 响应

encoding/json 包是 Go 标准库中用于编码和解码 JSON 数据的核心组件。通过这个包,你可以轻松地将 JSON 数据解析为 Go 结构体,或者将 Go 结构体编码为 JSON 数据。

关键步骤

  1. 导入包

    go
    深色版本
    import (
        "encoding/json"
        "fmt"
    )
    
  2. 定义结构体

    • 定义与 JSON 响应结构匹配的结构体。使用结构体标签(如 json:"field_name")来指定 JSON 字段与结构体字段的对应关系。这使得解析 JSON 数据变得更加直观和准确。
    go
    深色版本
    type DictionaryResponse struct {
        Rc          int               `json:"rc"`
        Wiki        map[string]string `json:"wiki"`
        Dictionary  Dictionary        `json:"dictionary"`
    }
    
    type Dictionary struct {
        Prons         Pronunciations `json:"prons"`
        Explanations  []string       `json:"explanations"`
    }
    
    type Pronunciations struct {
        En    string `json:"en"`
        EnUs  string `json:"en-us"`
    }
    
  3. 解析 JSON 数据

    • 使用 json.Unmarshal 函数将 JSON 字符串解析为定义的结构体。如果解析成功,结构体将包含 JSON 响应中的数据。通过检查解析错误,确保数据解析的准确性。
    go
    深色版本
    var dictResponse DictionaryResponse
    err = json.Unmarshal(respBody, &dictResponse)
    if err != nil {
        fmt.Println("Error parsing JSON response:", err)
        return
    }
    

3. 字符串处理

使用 strings 包提供的函数处理字符串

strings 包是 Go 标准库中用于处理字符串的强大工具。它提供了许多有用的函数,可以帮助你进行字符串的格式化、查找、替换等操作,使数据处理更加灵活和高效。

关键步骤

  1. 导入包

    go
    深色版本
    import (
        "strings"
    )
    
  2. 常用函数

    • strings.ToUpper(s string):将字符串中的所有字符转换为大写。
    • strings.ToLower(s string):将字符串中的所有字符转换为小写。
    • strings.TrimSpace(s string):去除字符串首尾的空白字符。
    • strings.Contains(s, substr string):检查字符串是否包含指定的子字符串。
    • strings.Replace(s, old, new, n int):将字符串中的某个子字符串替换为另一个子字符串,最多替换 n 次。

4. 错误处理

使用 if err != nil 语句检查错误,并使用 defer 关键字确保资源关闭

错误处理是编写健壮代码的重要部分。在 Go 中,错误通常通过返回值传递,因此你需要在每个可能出错的地方进行错误检查。通过合理的错误处理,可以确保程序在遇到错误时能够优雅地处理,并释放系统资源。

关键步骤

  1. 检查错误

    • 使用 if err != nil 语句检查错误。如果发生错误,打印错误信息并终止程序或采取其他适当的措施。这有助于及时发现和解决问题。
    go
    深色版本
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    
  2. 延迟关闭资源

    • 使用 defer 关键字确保在函数结束时关闭资源。这对于确保文件、网络连接等资源在使用完毕后正确关闭非常重要。defer 语句会在函数返回前执行,确保资源释放。
    go
    深色版本
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error sending request:", err)
        return
    }
    defer resp.Body.Close()
    

5. 文件读写

使用 ioutil 包读取和写入文件

ioutil 包是 Go 标准库中用于文件操作的便捷工具。它提供了许多简洁的函数,可以帮助你轻松地读取和写入文件。通过这些函数,你可以轻松地处理文件操作,如读取配置文件或保存数据。

关键步骤

  1. 导入包

    go
    深色版本
    import (
        "io/ioutil"
        "os"
    )
    
  2. 读取文件

    • 使用 ioutil.ReadFile 函数读取文件内容。该函数返回一个字节切片,表示文件的内容。通过检查读取错误,确保文件读取的准确性。
    go
    深色版本
    data, err := ioutil.ReadFile("filename.txt")
    if err != nil {
        fmt.Println("Error reading file:", err)
        return
    }
    
  3. 写入文件

    • 使用 ioutil.WriteFile 函数写入文件内容。该函数接受文件名、要写入的数据(字节切片)和权限模式。通过检查写入错误,确保文件写入的准确性。
    go
    深色版本
    err = ioutil.WriteFile("filename.txt", []byte("Hello, World!"), 0644)
    if err != nil {
        fmt.Println("Error writing file:", err)
        return
    }
    

总结

通过以上步骤,你可以实现一个命令行版本的词典,调用第三方 API 获取单词的定义和发音。每个部分的详细解释如下:

  1. HTTP 请求

    • 使用 net/http 包创建和发送 HTTP 请求,设置请求头和请求体。这一步骤确保你可以与远程服务器进行通信并获取所需的响应。
  2. JSON 解析

    • 使用 encoding/json 包定义结构体并解析 JSON 响应。这一步骤确保你可以将接收到的 JSON 数据转换为易于操作的 Go 结构体。
  3. 字符串处理

    • 使用 strings 包提供的函数处理字符串。这一步骤帮助你进行字符串的格式化、查找、替换等操作,使数据处理更加灵活。
  4. 错误处理

    • 使用 if err != nil 语句检查错误,并使用 defer 关键字确保资源关闭。这一步骤确保你的程序在遇到错误时能够优雅地处理,并释放系统资源。
  5. 文件读写

    • 使用 ioutil 包读取和写入文件。这一步骤帮助你轻松地处理文件操作,如读取配置文件或保存数据。