使用 fmt.Scanf 简化猜谜游戏的代码实现
相关的函数用法
总体跟 C 语言几乎一模一样,除了返回值多了 err
实现
我们的需求其实很简单,就是读取一个数字。删掉原来代码中输入相关的代码,换成使用 Scanf 来读取。
删掉:
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
return
}
input = strings.TrimSuffix(input, "\n")
替换为:
var input string
fmt.Scanf("%v", &input)
程序可以正确运行
增加另一种翻译引擎的支持
选择百度翻译
首先仿照原代码使用百度翻译来完成
抓包
自动生成代码
复制 sug 请求的 cURL,粘贴到代码生成网站中,自动生成代码
运行此代码,发现可以成功获得响应
自动生成响应结构体
复制请求的 json,粘贴到自动生成结构体的网站中,就可以快速生成对应的结构体
实现对任意单词响应
为函数添加一个参数 word ,表示需要翻译的单词
首先需要构造请求,在老师讲的代码中,使用的是彩云小译,请求的 json 比较复杂,所以又构造了请求的结构体。而百度翻译的请求 json...
只有一个参数,那就没必要构造结构体了,直接拼请求 json
jsonInfo := []byte(`kw=`)
jsonInfo = append(jsonInfo, word...)
两行代码就拼好了
然后生成请求就可以了
var data = bytes.NewReader(jsonInfo)
req, err := http.NewRequest("POST", "https://fanyi.baidu.com/sug", data)
if err != nil {
log.Fatal(err)
}
读取响应体
首先使用 Unmarshal将响应体的内容保存到响应结构体中
var response BaiduResponse
err = json.Unmarshal(bodyText, &response)
if err != nil {
log.Fatal(err)
}
接下来把翻译出来的内容打印出来
fmt.Println(response.Data[0].V)
创建主函数
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, `usage:simpleDict WORD example: simpleDict hello`)
os.Exit(1)
}
word := os.Args[1]
baiduQuery(word)
}
运行结果
成功!
合并代码,让用户自行选择翻译引擎
增加一个参数,让用户自行选择一个翻译引擎。默认选择为彩云
func main() {
if len(os.Args) < 2 {
fmt.Fprintf(os.Stderr, `usage:simpleDict WORD example: simpleDict hello`)
os.Exit(1)
}
word := os.Args[1]
if len(os.Args) == 3 {
if os.Args[2] == "caiyun" {
query(word)
} else if os.Args[2] == "baidu" {
baiduQuery(word)
} else {
fmt.Fprintf(os.Stderr, `please select one from "caiyun" and "baidu"`)
os.Exit(1)
}
} else {
query(word)
}
}