这是我参与「第五届青训营 」伴学笔记创作活动的第 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请求,如何利用代码生成网站加快我们的开发效率。