第一次课程前半部分讲了Go基本语法,后半部分讲了三个小项目
零、Go基础
1、基本语法
变量
声明、初始化、匿名变量
数据类型
整形、浮点型、布尔、字符型、字符串、切片、
指针
变量的生命周期
常量
变量别名
2、容器
数组
声明、初始化、遍历
切片(slice)
make()、append()
映射(map)
列表(list)
3、流程控制
- 条件判断:if
- 循环:for
- 键值循环:for range
- 分支选择:switch
- 代码跳转:goto
一、猜字谜游戏
1、代码版本一
1 | package main |
每次运行输出的数字都是同样的
随机数种子
2、代码版本二
需要设置代码随机数种子,设置为当前的时间戳
1 | rand.Seed(time.Now().UnixNano()) |
3、代码版本三
实现用户的输入输出
1 | reader := bufio.NewReader(os.Stdin) |
4、代码版本四
使用循环实现游戏的循环
变量、循环、函数、文件流、错误处理等
二、命令行版本词典
调用第三方API
使用Go发送网络请求,解析JSON,并使用相应的代码生成工具提高开发效率
1、抓包
抓取第三方翻译平台的API
按f12打开开发人员工具,找到正确的请求
2、代码生成
右键请求
复制结果如下:
1 | curl 'https://api.interpreter.caiyunai.com/v1/dict' \ |
然后我们就去这个平台生成代码:Go代码生成
1 | package main |
3、生成requst body
1 | type DictRequest struct { |
将请求结构体序列化为JSON:
1 | request := DictRequest{TransType: "en2zh", Source: "good"} |
4、response body的解析
由于结构复杂,为了防止出错,我们使用第三方代码生成工具
去这个平台进行Go结构体的生成:Go结构体
1 | type AutoGenerated struct { |
接下来就反序列化response body了:
1 | var dictResponse DictResponse |
获取JSON中指定的信息
1 | fmt.Println("UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs) |
5、获取命令行参数
1 | if len(os.Args) != 2 { |
三、SOCKET5代理服务器
1、socks5原理
2、向一个连接读写数据
读数据:
1 | reader := bufio.NewReader(conn) |
写数据:
1 | _, err = conn.Write([]byte{b}) |
4、连接的各个流程
基于字节流,根据协议规则,依次读取字节,将字节拼接成不同的具体数据
5、实现双向的数据转发
任何一个方向的数据copy失败,我们就返回这个函数,并关闭连接清理数据
1 | ctx, cancel := context.WithCancel(context.Background()) |