Go语言的实战案例 | 青训营笔记

98 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

一、随机猜谜游戏

用户需要猜出当前系统随机生成的数字是多少。如果猜小,猜大系统会给出提示,猜对的时候系统终止。

知识点:

1、输入输出

 var x int        // 定义变量x
 fmt.Fscan(&x)   // 接受用户输入的x
 fmt.Println(x)  // 输出x并换行

2、判断语句,循环语句

 for {
     // 无限循环
     if x < 0 {
     // 如果x<0就执行这部分语句
     } else {
     // 否则执行这个语句
     }
 }

3、随机种子的使用

 rand.Seed(time.Now().Unix())  // 以当前的时间作为随机种子,如果随机种子一样,随机生成的数将会一样
 x := rand.Intn(100)          // 从100范围内生成一个随机整数

完整代码实现:

 package main
 ​
 import (
     "fmt"
     "math/rand"
     "time"
 )
 ​
 func main() {
     maxNum := 100
     rand.Seed(time.Now().Unix())
     secretNumber := rand.Intn(maxNum)
     var x int
     fmt.Println(secretNumber)
     fmt.Println("请输入你要猜的数组,100以内")
     for {
         fmt.Scan(&x)
         if x < 0 || x > 100 {
             fmt.Println("你猜的数字不合法,请重新输入")
             continue
         }
         if x > secretNumber {
             fmt.Println("你猜的数字大了")
         } else if x < secretNumber {
             fmt.Println("你猜的数字小了")
         } else {
             fmt.Println("恭喜你猜对了")
             break
         }
     }
 ​
 }
 ​

二、在线词典

用户在命令行查询一个单词,程序通过调用第三方的API查询单词并翻译

知识点:

1、用go语言发送HTTP请求、解析json

2、使用代码生成提高开发效率

v1版本的代码在干嘛?详细注释放在了代码里面

 package main
 ​
 import (
     "fmt"
     "io/ioutil"
     "log"
     "net/http"
     "strings"
 )
 ​
 func main() {
     /* 
     http.Client是Go标准库中实现的HTTP客户端。它提供了向HTTP服务器发送请求的简单方法。
     可以通过它的Do()方法发送一个 http.Request对象,并返回一个http.Response对象。
     这个对象包含服务器的响应。这个http.Client{}是创建一个http.Client类型的空结构体,使用默认的超时时间。
     在这段代码中,client变量实际上是一个指向http.Client类型的指针,在后面的代码中通过该client变量发出请求。
     */
     client := &http.Client{}
     
     
     /* 
     这行代码创建了一个字符串变量data,其中包含请求的JSON数据。
     strings.NewReader()函数接受一个字符串参数,并返回一个io.Reader接口类型的值,它可以把字符串当作一个数据流进行读取
     这里传递的字符串是{"trans_type":"en2zh","source":"good"},是一个JSON格式的字符串,包含了两个字段:trans_type和source。
     在创建http.Request对象时,会使用这个data变量作为请求体。
     */
     var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`) 
     
     /* 
     这行代码使用http.NewRequest()函数创建了一个http.Request对象。
     http.NewRequest()函数接受三个参数:
         第一个参数是请求方法,这里是"POST"
         第二个参数是请求地址,这里是"https://api.interpreter.caiyunai.com/v1/dict"
         第三个参数是请求体,这里是data变量
     函数将会返回一个http.Request对象和一个error类型的变量,如果error不为nil,表明发生错误,使用log.Fatal(err)输出错误信息并结束程序
     这个请求对象包含了请求的方法、地址、请求头和请求体等信息,将会在后面的代码中使用该对象发出请求。
     */
     req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
     if err != nil {
         log.Fatal(err)
     }
     
     // 设置了请求的头信息,包括连接类型、User-Agent、请求来源等
     req.Header.Set("Connection", "keep-alive")
     req.Header.Set("DNT", "1")
     req.Header.Set("os-version", "")
     req.Header.Set("sec-ch-ua-mobile", "?0")
     req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
     req.Header.Set("app-name", "xy")
     req.Header.Set("Content-Type", "application/json;charset=UTF-8")
     req.Header.Set("Accept", "application/json, text/plain, */*")
     req.Header.Set("device-id", "")
     req.Header.Set("os-type", "web")
     req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
     req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
     req.Header.Set("Sec-Fetch-Site", "cross-site")
     req.Header.Set("Sec-Fetch-Mode", "cors")
     req.Header.Set("Sec-Fetch-Dest", "empty")
     req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
     req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
     req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
     
     // 使用client.Do()函数发送请求
     /*
     这行代码使用http.Client类型的client变量发送请求,并将响应结果存储在resp变量中。
     client.Do()函数接受一个http.Request对象并发送请求,并返回一个http.Response对象和一个error类型的变量。如果error不为nil,表明发生错误,使用log.Fatal(err)输出错误信息并结束程序
     http.Response对象包含了服务器的响应,包括响应码、响应头和响应体等信息。在后面的代码中会使用resp变量读取响应内容。
     */
     resp, err := client.Do(req)
     if err != nil {
         log.Fatal(err)
     }
     defer resp.Body.Close()
     
     // 读取响应内容并输出
     /*
     这行代码使用ioutil.ReadAll()函数读取了http.Response的响应体(body)并将其存储在bodyText变量中。
     ioutil.ReadAll()函数接受一个io.Reader类型的参数,并返回一个字节切片和一个error类型的变量。如果error不为nil,表明发生错误,使用log.Fatal(err)输出错误信息并结束程序
     这里传递的参数是resp.Body,它是一个io.ReadCloser类型的值,表示响应体的数据流。
     ioutil.ReadAll()函数会读取整个数据流并返回一个字节切片,这样我们就可以在后面使用这个bodyText变量来输出响应内容。
     */
     bodyText, err := ioutil.ReadAll(resp.Body)
     if err != nil {
         // 如果发生错误,使用log.Fatal()输出错误信息并结束程序
         log.Fatal(err)
     }
     fmt.Printf("%s\n", bodyText)
 }
 ​

值得注意的是,我们中间很长的一段代码都不是由我们自己编写的,而是直接生成的。

同样,request body也是根据json自动生成的。利用代码生成网站,能极大加速开发效率

至于v2,v3,v4版本,其实就是在V1版本的基础上进行了简单的优化,实际上我们从v1版本就学到了如何传送http请求,如何利用代码生成网站加快我们的开发效率。