这篇笔记将针对第一节课的命令行字典程序进行优化,以提高其性能和资源利用率。我们将逐步改进程序的不同方面,包括代码结构、HTTP请求、错误处理等。
1. 整理请求头部信息
原始代码中设置了大量的请求头部信息,我们可以将它们整理成一个map,然后在创建请求时一次性设置,使代码更整洁。
headers := map[string]string{
"Connection": "keep-alive",
"DNT": "1",
// ... 其他请求头信息
}
for key, value := range headers {
req.Header.Set(key, value)
}
2. 使用结构体直接传递请求数据
可以使用结构体直接传递请求数据,这会使代码更加清晰和易于维护。
requestData := DictRequest{
TransType: "en2zh",
Source: word,
}
buf, err := json.Marshal(requestData)
if err != nil {
log.Fatal(err)
}
data := bytes.NewReader(buf)
req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
3. 改进错误处理
原始代码中使用了log.Fatal来处理错误,这会导致程序直接退出。我们应该记录错误并继续执行,以收集更多错误信息。
if resp.StatusCode != 200 {
log.Println("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
return
}
4. 并发查询
如果要查询多个词汇,可以使用并发goroutine来加快查询速度。利用sync.WaitGroup来等待所有查询完成。
var wg sync.WaitGroup
words := []string{"hello", "world", "go"}
for _, word := range words {
wg.Add(1)
go func(w string) {
defer wg.Done()
query(w)
}(word)
}
wg.Wait()
5. 命令行参数解析
使用flag包来更优雅地解析命令行参数,使参数处理更加清晰。
func main() {
wordPtr := flag.String("word", "", "the word to query")
flag.Parse()
if *wordPtr == "" {
fmt.Println("Usage: program -word WORD")
return
}
query(*wordPtr)
}
6. 结论
通过优化代码结构、HTTP请求、错误处理和并发查询,我们可以显著提高Go程序的性能和资源利用率。利用Go语言的特性,如goroutine和flag包,可以使代码更加清晰、高效和易于扩展。继续探索Go语言的功能,将有助于我们不断提升编程技能和开发效率。