实践笔记:使用Go语言构建英文词典查询工具
作为一名参加字节跳动青训营的大学生,我有幸学习到了很多有趣和实用的知识。在课程中,我学习了如何使用Go语言构建实用的命令行工具。在这篇笔记中,我将分享我在课程作业中开发的英文词典查询工具的经验和心得。
项目简介
本项目旨在使用Go语言编写一个命令行工具,允许用户输入一个英文单词,然后查询并返回与该单词相关的字典信息。我们使用了彩云小译的API来获取字典数据,并且通过对HTTP请求和JSON解析进行了实现。
项目结构
为了保持代码整洁有序,我们对项目进行了良好的结构规划。以下是项目的目录结构:
goCopy code
dictionary_app/
├── main.go
├── api/
│ ├── request.go
│ ├── response.go
│ └── client.go
└── utils/
└── input.go
main.go:主程序入口,处理用户输入并调用其他模块进行查询和显示。api/:封装了与API请求和响应相关的代码。utils/:包含用于处理用户输入的工具函数。
1. api/request.go:
goCopy code
package api
type DictRequest struct {
TransType string `json:"trans_type"`
Source string `json:"source"`
UserID string `json:"useID"`
}
// ... other code related to request
2. api/response.go:
goCopy code
package api
type DictResponse struct {
Rc int `json:"rc"`
Wiki struct {
} `json:"wiki"`
// ... other fields
}
3. api/client.go:
goCopy code
package api
import (
"bytes"
"encoding/json"
"io"
"log"
"net/http"
)
type APIClient struct {
client *http.Client
}
func NewAPIClient() *APIClient {
return &APIClient{
client: &http.Client{},
}
}
func (c *APIClient) Query(word string) (*DictResponse, error) {
request := DictRequest{TransType: "en2zh", Source: word}
buf, err := json.Marshal(request)
if err != nil {
return nil, err
}
data := bytes.NewReader(buf)
req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
// ... set headers
resp, err := c.client.Do(req)
// ... handle response
// ... parse response body into DictResponse
return &dictResponse, nil
}
4. utils/input.go:
goCopy code
package utils
import (
"bufio"
"os"
"strings"
)
func GetUserInput() (string, error) {
reader := bufio.NewReader(os.Stdin)
println("请输入你要查询的单词:")
word, err := reader.ReadString('\n')
if err != nil {
return "", err
}
return strings.TrimSpace(word), nil
}
5. main.go:
goCopy code
package main
import (
"fmt"
"log"
"./api"
"./utils"
)
func main() {
word, err := utils.GetUserInput()
if err != nil {
log.Fatal("输入时发生错误,请重新输入", err)
}
client := api.NewAPIClient()
resp, err := client.Query(word)
if err != nil {
log.Fatal("请求发生错误", err)
}
fmt.Println(resp.Dictionary.Entry, "UK:", resp.Dictionary.Prons.En, "US:", resp.Dictionary.Prons.EnUs)
for _, item := range resp.Dictionary.Explanations {
fmt.Println(item)
}
}
代码实现
在 api 目录中,我们定义了用于构建请求、解析响应以及存储响应数据的结构体。使用 http.Client 来发送HTTP请求,然后从响应中读取和解析JSON数据。
在 utils 目录中,我们编写了用于获取用户输入的函数,以及对输入进行处理和清理的工具函数。
在 main.go 文件中,我们将用户输入与API查询和响应处理结合起来。我们实例化一个 APIClient 对象来进行查询,并根据响应的结果打印出相应的字典信息。
心得体会
通过这个项目,我学会了如何使用Go语言构建命令行工具,从而更好地组织代码、实现模块化和处理HTTP请求。我了解到了如何处理JSON数据,以及如何处理用户输入以提高用户体验。
此外,我还学到了良好的项目结构和代码组织对于代码可读性和可维护性的重要性。将代码分成不同的模块和文件,每个文件负责不同的功能,使得代码更加清晰、易于维护。
总的来说,这个项目让我在实践中掌握了很多有用的技能,也为我未来在开发中积累了宝贵的经验。
总结
通过参加字节跳动青训营,我得以深入学习了Go语言的应用,尤其是如何使用它来构建实用的工具。通过构建这个英文词典查询工具,我不仅掌握了一些有关HTTP请求、JSON解析和命令行界面的技能,还体验到了代码组织和结构的重要性。
我相信这些学习将对我的职业发展产生积极影响,也期待在未来的开发中继续运用这些知识和技能。