Day1—— Go语言基础|青训营笔记
Go 语言简明教程 | 快速入门 | 极客兔兔 (geektutu.com)
学习
- 接口:
- Go接口是一组方法的集合
- 不包含方法的实现
- json数据操作:
- 并发:
- 两个或两个以上的任务在一段时间内被执行。
- CSP并发模型:通过
goroutine和channel实现
操作系统没学好,重新复习 Go并发原理 - 掘金 (juejin.cn)
- http协议:
- HTTP是一个客户端(用户)和服务端(网站)之间请求和应答的标准。
- 在HTTP协议中客户端发送请求接收响应,服务端接收请求发送响应,在HTTP中数据可以被称为资源可以是HTML文档、图片、普通文本等。
- 资源是通过URL来进行定位的,URL的组成部分包括:协议+ 主机(host)+ 路径(path)+ 查询参数(query)
- 发送HTTP请求的内容包括:请求方式(GET\POST\PUT\HEAD)、路径(path)和查询参数、HTTP版本、Request Header请求头、Request Body请求体(POST)
- 接收HTTP响应包含:HTTP版本、响应状态码、Request Header响应头(包含额外的信息告诉客户端如何控制缓存和cookie),响应体(从服务端返回的数据)
- HTTP是无状态的,每一次请求都认为是从全新的客户端发来的请求,如果需要记录状态的话需要cookie和session来保持会话
实践
1.猜谜小游戏
项目介绍:
使用 Golang 来构建一个猜数字游戏。在这个游戏里面,程序首先会生成一个介于 1 到 100 之间的随机整数,然后提示玩家进行猜测。玩家每次输入一个数字,程序会告诉玩家这个猜测的值是高于还是低于那个秘密的随机数,并且让玩家再次猜测。如果猜对了,就告诉玩家胜利并且退出程序。
学习:
随机数、随机数种子
实现步骤:
- 随机数生成:
- 导入生成随机数需要的 math/rand 包,并以时钟作为参数初始化随机数种子
- 变量maxNum 作为随机数生成范围
一开始使用rand.Seed()为随机数种子,结果发现Go 1.2 0以来它被弃用了,改用rand.New(rand.NewSource(seed)),注:NewSource 默认是并发不安全 如何正确使用随机数?|调用|rand|代码_网易订阅 (163.com)
// 随机数生成
func random(numMax int) (num int) {
rand.New(rand.NewSource(time.Now().UnixNano())//以当前纳秒数作为随机数种子
num = rand.Intn(numMax + 1) //[0,numMax]
return num
}
- 用户输入数字:
var guessNumber int
fmt.Println("输入你猜的数:")
fmt.Scanf("%d ", &guessNumber)
- 判断是否正确 : 将用户输入的数字与本次程序生成的随机数比较,不相等返回大于或小于。用户重新输入数字猜测,直到用户输入正确。
// 判断是否猜对
//参数secNumber本轮随机数,gusNumber用户猜测数
//返回s文本,flag猜中为true
func judgment(secNumber, gusNumber int) (s string, flag bool) {
if gusNumber < secNumber {
s = "你猜的数比实际的小,再猜猜看"
flag = false
} else if gusNumber > secNumber {
s = "你猜的数比实际的大,再猜猜看"
flag = false
} else {
s = "你猜对了,真是个小聪明!"
flag = true
}
return s, flag
}
- 主程序
func main() {
//1.生成随机数
numMax := 100
secertNumber := random(numMax)
for {
//2.用户输入数字
var guessNumber int
fmt.Println("输入你猜的数:")
fmt.Scanf("%d ", &guessNumber)
//3.判断是否猜对
s, flag := judgment(secertNumber, guessNumber)
fmt.Println(s)
if flag == true { //猜对跳出循环
break
} else { //猜错接着猜
continue
}
}
}
2.在线词典
项目介绍:
用户可以在命令行里面查询一个单词。此程序通过调用第三方的 API在线查询单词的翻译并打印出来。
学习:
用 go 语言来发送 HTTP 请求、解析 json
实现步骤:
- 抓包: 本项目使用彩云翻译API实现在线翻译,开发者工具获取api
- 打开百度翻译网页:彩云小译 - 在线翻译 (caiyunapp.com)
- 打开开发者工具,找到翻译接口请求 network->XHR->Header
- 找到查询单词的请求,HTTP 的 post 的请求
- 查看API 的返回结果,里面会有 dictionary、wikit 两个字段。我们需要用的结果主要在dictionary 字段里面,包括单词翻译、音标等信息。
- Golang 发起 Post 请求 使用标准库中的 net/http 包来实现 POST 请求。实现 POST 请求的步骤有以下几步:
- 创建 http.Client Golang 的标准库中有一个 http.Client 结构体,它封装了所有向 HTTP 服务器发起请求的方法。我们可以通过创建一个 http.Client 对象来发送请求。
//创建一个空的 http.Client 对象
client := &http.Client{}
- 创建请求主体(Request Body) 请求主体是 HTTP 请求里面的主要内容,针对百度翻译API创建请求主体。 首先请求序列化:构造出来一个结构体dictRequest发送请求
//发送的JSON数据的结构体类型
type dictRequest struct {
TransType string `json:"trans_type"` //翻译类型
Source string `json:"source"` //翻译的单词
}
response反序列化:结构体dictResponse,将返回的 JSON 反序列化到结构体里面。
type BaiDuDictResponse struct {
TransResult struct {
(省略)
}
}
-
创建请求对象(Request) 我们需要创建一个 http.Request 对象,设置请求的目标地址、请求方式和请求主体等信息。通过将请求主体设置到 http.Request 对象的 Body 字段,可以将请求主体提交到服务器。
-
发送请求 发送请求可以使用 http.Client 的 Do 方法,它返回一个 http.Response 对象和一个错误对象。我们需要根据错误信息来处理请求是否发送成功。如果成功发送了请求,可以通过 http.Response 对象获取服务器返回的 HTTP 状态码和响应主体等信息。
-
处理响应 当服务器返回响应后,我们需要对响应进行处理。观察那个 json 可以看出需要的结果是在 dict_result.simple_means 里的,用 for range 循环来迭代输出它。