第二天听了下课感觉前面GO语言实战不咋滴,回去看了一遍又敲了一遍。
1.猜谜游戏
生成随机数:
主函数main的代码
func main() {
maxnum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxnum)
fmt.Println("the secrrt is", secretNumber)
}
rand.Seed(time.Now().UnixNano()): 为math/rand包中的随机数生成器设置种子值。通过使用当前的Unix时间戳(以纳秒为单位,time.Now().UnixNano()),确保每次程序运行时生成的随机数都是不同的。
secretNumber := rand.Intn(maxnum): 使用math/rand包中的rand.Intn()函数生成一个随机整数。它以最大值(maxnum,在这里是100)作为参数,并返回一个介于0(包含)和maxnum(不包含)之间的随机整数。随机生成的数字然后被赋给变量secretNumber。
读取用户输入:
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("Error reading input:", err)
return
}
input = strings.TrimSuffix(input, "\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter a valid integer.")
return
}
fmt.Print("you guess", guess)
reader := bufio.NewReader(os.Stdin): 这一行创建了一个新的 bufio.Reader 对象,并使用 os.Stdin 标准输入作为读取源。bufio.Reader 用于从输入源中读取数据,这里我们使用它从控制台读取用户输入。
input, err := reader.ReadString('\n'): 这一行从标准输入中读取数据,直到遇到换行符 '\n'。它将读取的数据存储在 input 变量中,并在读取时检查是否发生了错误。如果在读取过程中发生了错误,例如输入流结束或无法读取数据,它会将错误信息存储在 err 变量中。
strings.TrimSuffix() 函数去除读取的 input 变量中的换行符 '\n'。用户输入通常以换行符结尾,使用这个函数可以去除换行符,使得输入更规范化。
guess, err := strconv.Atoi(input): 这一行尝试将去除换行符的 input 字符串转换为整数类型。它使用 strconv.Atoi() 函数来进行转换。如果转换成功,将结果存储在 guess 变量中;如果转换失败,将错误信息存储在 err 变量中。
最后代码加入判断逻辑和for循环就完成了。
2.在线词典
1.抓包:
打开彩云小译网页,f12检查,点击网页的翻译键,找到查询单词的请求。
这是一个 HTTP 的 post 的请求,请求头是一个 json ,里面有两个字段,一个是代表从什么语言转化成什么语言, source 是要查询的单词。 API 的返回结果里面会有 Wiki 和 dictionary 两个字段。我们需要用的结果主要在dictionary.Explanations 字段里面。其他有些字段里面还包括音标等信息。
2.代码生成
复制页面请求curl(bash),粘贴到Convert curl to Go (curlconverter.com)中,转换成go语言格式
粘贴到vscode中,删除编译错误的几行,运行可以得到一个json.
这段代码的大致流程是:创建一个 HTTP client,创建的时候可以指定很多参数,包括比如请求的超时是否使用 cookie 等。接下来是构造一个 HTTP 请求,这是一个 post 请求,用到 HTTP .NewRequest ,第一个参数是 http 方法 POST, 第二个参数是 URL, 最后一个参数是 body。
用strings.NewReader 来把字符串转换成一个流,这样就成功构造了一个 HTTP request ,接下来需要对这个 HTTP request 来设置一堆 header。
调用 client.do request ,就能得到 response ,如果请求失败的话,那么这个 error 会返回非 nil,会打印错误并且退出进程。response 有它的 HTTP 状态码, response header和body。
body同样是一个流,在golang里面,为了避免资源泄露,需要加一个 defer 来手动关闭这个流,这个 defer 会在这个函数运行结束之后去执行。接下来使用 ioutil.ReadAll 来读取这个流,能得到整个body,再用 print 打印出来。
3.生成request body
要生成request需要先生成一个response结构体,与生成的json对应起来,这一步可以通过网上的工具网站来实现。JSON转Golang Struct - 在线工具 - OKTools
效果:
将代码添加到原来的.go文件中,再添加代码
var dict AutoGenerated
err = json.Unmarshal(bodyText, &dict)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", dict)
运行后可以打印出结果,接近预期目标。
观察 json 可以看出需要的结果是在 Dictionary.explanations.
用 for range 循环来迭代它,然后直接打印结构,参照一些词典的显示方式,我们可以在那个前面打印出这个单词和它的音标。
4.完善代码
继续把代码的主体改成一个 query 函数,查询的单词作为参数传递进来。然后写一个简单的 main 函数,这个 main 函数首先判断一下命令和参数的个数,如果它不是两个,那么我们就打印出错误信息,退出程序。 否则就获取到用户输入的单词,然后执行 query 函数。
这样就能完成数字字典。