GO语言工程实践课后作业:实现思路、代码以及路径记录(上)|青训营(实践)

60 阅读6分钟

一、猜谜游戏

通过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/httpgo-resty

调用网页 API 的原理如下:

  1. 创建 HTTP 请求:使用 http.NewRequest 函数创建一个 HTTP 请求对象。该函数接受请求方法(GET、POST 等)、URL 以及可选的请求体数据作为参数,并返回一个 http.Request 对象。
  2. 设置请求头部:对于某些需要特定头部信息的 API,你可以使用 req.Header.Set 方法设置请求头部字段,例如设置认证信息、内容类型、用户代理等。
  3. 发送请求:使用 http.ClientDo 方法发送 HTTP 请求。Do 方法接收一个 http.Request 对象,并返回一个 http.Response 对象,其中包含了响应的状态码、头部信息和响应体数据。
  4. 处理响应:你可以通过访问 http.Response 对象的属性来获取响应的状态码、头部信息以及响应体数据。你可以使用 ioutil.ReadAll 函数读取响应体数据,并根据需要进行处理。
  5. 关闭响应:在完成对响应的处理后,记得关闭响应体数据流,以释放相关的系统资源。你可以调用 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 可以指向网页、图片、视频、文件等各种形式的资源。