一、猜谜游戏
通过rand生成随机数;再用生成随机数种子的方式使得每次生成的数都不一样;后读取用户输入的数(可以有多种方式);再实现逻辑判断,提示用户猜的数是太大还是太小;最后是实现循环,使得猜数猜错时不断进行到猜对为止
在修改代码的时候要注意 Go 语言的间接性,所以在修改之后需要删除之前import引入的部分库,存在任何导入未使用的包或者变量都会编译报错
rand.Intn(n) 生成范围为0->n-1
//产生随机数
maxNum := 100
rand.Seed(time.Now().UnixMilli())
secretNum := rand.Intn(maxNum)
fmt.Println("The secret number is :", secretNum)
//获取用户输入
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
//"操作系统”(operating system)
//bufio.NewReader() 是 bufio 包中的一个函数,用于创建一个基于指定输入源的新的 bufio.Reader 对象。
//os.Stdin 是一个指向标准输入流(通常是键盘输入)的 *os.File 对象,是 Go 语言标准库的一部分。
//使用 bufio.Reader 读取输入数据通常比直接使用 fmt.Scan 或 fmt.Scanln 更灵活,可以更精确地控制读取的行为,例如读取指定长度的字节、读取一行文本等
for {
input, err := reader.ReadString('\n') //指定输入结束符
if err != nil {
fmt.Println("An error occurred while reading input.Please try again", err)
continue
}
input = strings.TrimSuffix(input, "\r\n") //去除 input 字符串的末尾换行符 “\n”,并将处理后的结果重新赋值给 input
//strings.TrimSpace(str) 和 strings.TrimSuffix(str, suffix) 都是 Go 语言标准库中字符串处理的函数,但它们的具体功能有所不同。
strings.TrimSpace(str) 是去除字符串 str 的首尾空白字符(包括空格、制表符和换行符)。
"修剪”(trimming)
例如,strings.TrimSpace(" hello world\n") 的结果是 "hello world",去除了首尾的空格和换行符。
strings.TrimSuffix(str, suffix) 是去除字符串 str 末尾指定的后缀 suffix。
例如,strings.TrimSuffix("hello world.jpg", ".jpg") 的结果是 "hello world",去除了末尾的 “.jpg” 后缀。
需要注意的是,这两个函数的作用不同,strings.TrimSpace(str) 是针对字符串的首尾空白字符进行处理,而 strings.TrimSuffix(str, suffix) 是针对字符串的末尾指定后缀进行处理
//在 Unix、Linux 和 macOS 等类 Unix 系统中,行尾通常使用换行符 \n 表示。
//在 Windows 系统中,行尾通常使用回车换行符 \r\n 表示。
//\r 是回车符(Carriage Return),而 \n 是换行符(Line Feed)。
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println(err)
continue
}
fmt.Println("Your guess is", guess)
//判断大小
if guess > secretNum {
fmt.Println("Your guess is bigger than the secret number.Please try again")
} else if guess < secretNum {
fmt.Println("Your guess is less than the secret number.Please try again")
} else {
fmt.Println("Correct,you Lagend!")
break
}
}
会存在可能每次会生成固定的数字,所以为了避免此情况。我们根据课程所提示那样,用一个在线时间戳来初始化随机数种子(time.now.unix)
-
UnixNano()、UnixMicro()和UnixMilli()是时间函数,用于获取当前时间的纳秒、微秒和毫秒。它们是针对Unix时间的不同精度级别的时间戳函数。
- UnixNano()返回当前时间的纳秒级精度时间戳,即从Unix纪元(1970年1月1日00:00:00 UTC)至今的纳秒数。
- UnixMicro()返回当前时间的微秒级精度时间戳,即从Unix纪元至今的微秒数。
- UnixMilli()返回当前时间的毫秒级精度时间戳,即从Unix纪元至今的毫秒数。
-
随机数种子的调试
-
在 Go 1.17 版本中,
math/rand包中的Seed函数被弃用了。这是因为旧的rand包在设置随机种子时存在一些问题,导致生成的随机数序列不够随机。在 Go 1.17 中,新的
math/rand包引入了全局的随机数生成器,并且自动地初始化了一个种子。这意味着开发人员不再需要显式地设置随机种子。为了确保向后兼容性,已弃用的
Seed函数会在调用时触发一个运行时错误。开发人员应该删除对Seed函数的调用,并将代码迁移到新版本的math/rand包实现。
-
二、在线词典
通过彩云翻译的例子,制作了一个使用百度翻译Api的在线词典,如下:
1.抓包 2.代码生成 3.解析response 4.通过cmd命令窗口运行go文件
Golang 通过使用 HTTP 客户端库调用网页 API。这些库包括内置的 net/http 包以及其他第三方库,如 gorilla/http 和 go-resty。
调用网页 API 的原理如下:
- 创建 HTTP 请求:使用
http.NewRequest函数创建一个 HTTP 请求对象。该函数接受请求方法(GET、POST 等)、URL 以及可选的请求体数据作为参数,并返回一个http.Request对象。 - 设置请求头部:对于某些需要特定头部信息的 API,你可以使用
req.Header.Set方法设置请求头部字段,例如设置认证信息、内容类型、用户代理等。 - 发送请求:使用
http.Client的Do方法发送 HTTP 请求。Do方法接收一个http.Request对象,并返回一个http.Response对象,其中包含了响应的状态码、头部信息和响应体数据。 - 处理响应:你可以通过访问
http.Response对象的属性来获取响应的状态码、头部信息以及响应体数据。你可以使用ioutil.ReadAll函数读取响应体数据,并根据需要进行处理。 - 关闭响应:在完成对响应的处理后,记得关闭响应体数据流,以释放相关的系统资源。你可以调用
resp.Body.Close()来关闭响应体。 HTTP:超文本传输协议(Hypertet Transfer Prorocol)
-
超文本即是在传统的text内容的传输之外的其余内容,如图片,音频,视频,超链接等
-
协议的存在性目的
- 需要明确的边界:开始-结束
- 能够携带信息:信息类型,信息内容
-
协议内容
-
请求行
-
方法名
- 常见方法名:GET POST PUT HEAD DELETE OPTIONS PATCH TRACE CONNECT
-
URL
-
协议版本
-
-
状态行
- 协议版本
- 状态码
- 状态码描述
url string:表示请求的 URL 地址,在这里请求的是 API 的 URL。URL 是统一资源定位符的缩写,用于标识和定位互联网上的资源。URL地址是一个字符串,用来描述一个资源在互联网中的位置。它通常由以下几个部分组成:
-
-
协议部分:表示访问资源所使用的协议,例如 HTTP、HTTPS、FTP 等;
-
主机部分:表示存放资源的主机名或 IP 地址;
-
端口部分:可选,表示访问主机时使用的端口号,默认值根据协议而定;
-
路径部分:表示资源在服务器上的具体路径;
-
查询部分:可选,用于传递参数给服务器端的查询字符串;
-
锚点部分:可选,表示页面中的特定位置或锚点。
一个完整的 URL 示例:https://www.example.com:8080/api/data?id=12345#section1 ,其中:
- 协议部分:
https:// - 主机部分:
www.example.com - 端口部分:
:8080 - 路径部分:
/api/data - 查询部分:
?id=12345 - 锚点部分:
#section1
URL 地址的作用是唯一标识互联网上的资源,可以通过浏览器或其他网络请求方式访问这些资源。根据不同的协议和资源类型,URL 可以指向网页、图片、视频、文件等各种形式的资源。