这是我参与「第五届青训营 」笔记创作活动的第1天
本节课重点
Go语言特色
- 简洁
- 快速
- 安全
- 并行编程
- 自动垃圾回收
Go语言基础语法
包声明
package main
引入包
// 单个引入
import "XXX"
// 多个包引入
import (
"xxx"
"xxx"
)
变量
可以指定变量类型,也可以让系统自动识别类型。
var num int
var num int = 100
var num = 100
nun := 100
函数
三种基本声明方式。
func xxx(parameter1, parameter2, data_type) (data_type)
func xxx(parameter1, parameter2, data_type) (data_type1, data_type2)
func xxx(parameter1, parameter2, data_type) (return_value data_type)
控制流
- 判断
- if else
- switch
- 不需要break,不会向下穿透
if 条件 {
} else {
}
switch 表达式 {
case 常量:
case 常量:
case 常量:
default:
}
- 循环
- for
- 注意左括号不能换行
- for
for {
}
for 条件;条件;条件; {
}
注释
- 单行注释
//您好这里是注释
- 多行注释
/*
这里是多行注释
这里是注释
*/
本节课难点
标准库
链接:Go语言标准库文档中文版
| 名称 | 摘要 | |
|---|---|---|
| bufio | bufio 包实现了带缓存的I/O操作. | |
| bytes | bytes包实现了操作[]byte的常用函数. | |
| container | ||
| heap | heap包提供了对任意类型(实现了heap.Interface接口)的堆操作. | |
| list | list包实现了双向链表. | |
| ring | ring实现了环形链表的操作. | |
| context | Package context defines the Context type, which carries deadlines, cancelation signals, and other request-scoped values across API boundaries and between processes. | |
| database | ||
| sql | sql 包提供了通用的SQL(或类SQL)数据库接口. | |
| driver | driver包定义了应被数据库驱动实现的接口,这些接口会被sql包使用. | |
| errors | error 包实现了用于错误处理的函数. | |
| fmt | fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. | |
| math | math 包提供了基本常数和数学函数。 | |
| big | big 包实现了(大数的)高精度运算. | |
| cmplx | cmplx 包为复数提供了基本的常量和数学函数. | |
| rand | rand 包实现了伪随机数生成器. | |
| net | net包提供了可移植的网络I/O接口,包括TCP/IP、UDP、域名解析和Unix域socket. | |
| os | os包提供了操作系统函数的不依赖平台的接口. | |
| regexp | regexp包实现了正则表达式搜索. | |
| sort | sort 包为切片及用户定义的集合的排序操作提供了原语. | |
| strconv | strconv包实现了基本数据类型和其字符串表示的相互转换. | |
| strings | strings包实现了用于操作字符的简单函数. | |
| sync | sync 包提供了互斥锁这类的基本的同步原语. | |
| text | ||
| time | time包提供了时间的显示和测量用的函数. |
实例
猜数游戏
二分法猜数。 功能拆分:
- 创造随机数
- 为了创造随机数,这里用当时时间戳做种子
- 处理输入
- 用bufio.NewReader(os.Stdin)读取输入
- 用reader.ReadString读入字符串
- 使用strings.TrimSuffix去除后缀
- strconv.Atoi转化类型为int
- 比较输出结果
命令行词典
- 利用edge开发人员工具获取翻译的curl
- 使用代码生成工具Convert curl commands to Go (curlconverter.com)生成代码
- 为request写一个结构体
- 将返回的json通过JSON转Golang Struct - 在线工具 - OKTools生成结构体
- 写输入输出信息
模拟Socks5
通过go语言模拟一个socks5的代理。
- 使用net包监听本地端口1080
- 写auth双向授权
- 读取的协议内容
- ver协议版本
- 支持认证的方法数量
- 读取methods
- 提供对应的验证方法信息
- ver协议版本
- method
- 读取的协议内容
- 模拟connect的协议
- 读取协议内容
- 回应客户端
- 双向转发
我遇到的问题及其解决方法
- 对socks5协议不太明白
- 查阅相关概念,协议内容。
- 对几种处理流(bufio, byte等)的分类应用不够透彻
- 查阅官方文档。