GO语言工程实践课后作业 | 青训营

46 阅读2分钟

使用 fmt.Scanf 简化猜谜游戏的代码实现

相关的函数用法

image.png

总体跟 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)

程序可以正确运行

image.png

增加另一种翻译引擎的支持

选择百度翻译

首先仿照原代码使用百度翻译来完成

抓包

image.png

自动生成代码

复制 sug 请求的 cURL,粘贴到代码生成网站中,自动生成代码

image.png

运行此代码,发现可以成功获得响应

image.png

自动生成响应结构体

复制请求的 json,粘贴到自动生成结构体的网站中,就可以快速生成对应的结构体

image.png

实现对任意单词响应

为函数添加一个参数 word ,表示需要翻译的单词

首先需要构造请求,在老师讲的代码中,使用的是彩云小译,请求的 json 比较复杂,所以又构造了请求的结构体。而百度翻译的请求 json...

image.png

只有一个参数,那就没必要构造结构体了,直接拼请求 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)
}

运行结果

image.png

成功!

合并代码,让用户自行选择翻译引擎

增加一个参数,让用户自行选择一个翻译引擎。默认选择为彩云

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)
	}
}

image.png