Go语言基础 | 青训营笔记

79 阅读5分钟

Day1—— Go语言基础|青训营笔记

Go 语言简明教程 | 快速入门 | 极客兔兔 (geektutu.com)

学习

  1. 接口:
  • Go接口是一组方法的集合
  • 不包含方法的实现

《Go语言原来这么简单》 -- 接口 - 掘金 (juejin.cn)

  1. json数据操作:

Golang 基础之json数据操作 - 掘金 (juejin.cn)

  1. 并发:
  • 两个或两个以上的任务在一段时间内被执行。
  • CSP并发模型:通过goroutinechannel实现

操作系统没学好,重新复习 Go并发原理 - 掘金 (juejin.cn)

  1. 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来保持会话

go语言发送http请求 - 掘金 (juejin.cn)

实践

1.猜谜小游戏

项目介绍:

使用 Golang 来构建一个猜数字游戏。在这个游戏里面,程序首先会生成一个介于 1 到 100 之间的随机整数,然后提示玩家进行猜测。玩家每次输入一个数字,程序会告诉玩家这个猜测的值是高于还是低于那个秘密的随机数,并且让玩家再次猜测。如果猜对了,就告诉玩家胜利并且退出程序。

学习:

随机数、随机数种子

实现步骤:

  1. 随机数生成:
  • 导入生成随机数需要的 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  
}
  1. 用户输入数字:
var guessNumber int  
fmt.Println("输入你猜的数:")  
fmt.Scanf("%d ", &guessNumber)
  1. 判断是否正确 : 将用户输入的数字与本次程序生成的随机数比较,不相等返回大于或小于。用户重新输入数字猜测,直到用户输入正确。
// 判断是否猜对  
//参数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  
}
  1. 主程序
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

实现步骤:

  1. 抓包: 本项目使用彩云翻译API实现在线翻译,开发者工具获取api
  • 打开百度翻译网页:彩云小译 - 在线翻译 (caiyunapp.com)
  • 打开开发者工具,找到翻译接口请求 network->XHR->Header
  • 找到查询单词的请求,HTTP 的 post 的请求
  • 查看API 的返回结果,里面会有 dictionary、wikit 两个字段。我们需要用的结果主要在dictionary 字段里面,包括单词翻译、音标等信息。

彩云翻译api.png

  1. 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 循环来迭代输出它。

3.SOCKS5代理服务器

Go手写SOCKS5代理服务器_哔哩哔哩_bilibili