这是我参与「第五届青训营」笔记创作活动的第1天
安装Go和配置开发环境
Git
由于课程中的示例代码都是使用Git,通过Github进行托管的。并且,我们后面也需要进行大作业的协作开发,同样也需要使用到Git。所以首先我们就需要安装好Git这个软件,并通过Github配置SSH私钥,让我们能正常通过SSH访问github。
具体步骤大致如下:
- 生成RSA密钥对,将公钥文件添加到Github设置页面。
- 将秘钥文件,复制到
~/.ssh/id_rsa。 - 打开命令行,使用命令
ssh -T git@github.com,出现Hi xxxxx! You've successfully authenticated, but GitHub does not provide shell access.即配置成功
Golang
首先前往Golang官网下载自己系统对应的安装包,并进行安装。安装完成后,clone示例项目。
运行go run example/01-hello/main.go,正确输出hello world,环境配置完成。
IDE
可以开Go的IDE有多种选择,比较推荐的有 VSCode 和 Goland ,因为本人经常使用的是JetBrains家的IDEA,只需要安装插件即可拥有Goland的相关功能,所以直接打开Settings->Plugins->Marketplace,搜索Go,下载并安装插件,就可以开始进行Golang的学习。
Go基础语法
在这里只记录了我个人认为和其他语言区别较大,需要区分的地方。
变量赋值
Go语言在赋值这一块和Python 新版本Java比较类似,可以不指定类型直接定义变量
var a = "initial" // 使用var关键词
b := a // 不使用var关键词
也可以在变量名后跟上类型名,对变量的类型进行指定
var b, c int = 1, 2
常量只需要更换关键词var为const
const s string = "constant"
for
Go中循环语句不像Java、Python等分为for循环和while循环,在Go中直接使用for即可进行两种循环。
下方的循环没有退出条件,可以使用break判断条件自行退出。
for {
fmt.Println("loop")
break
}
下方则是其他编程语言的一般的for循环。
for j := 7; j < 9; j++ {
fmt.Println(j)
}
Go同样拥有break continue关键词,对循环进行控制。
map
go语言中的map是一种一一对应的数据结构。使用下方代码进行初始化
m := make(map[string]int)
操作方法和Python的dict类似。
struct
在go中可以使用struct关键词来定义一个结构体
type user struct {
name string
password string
}
其中定义了这个结构体的成员变量,和对应的类型。 要初始化结构体,只需要
a := user{name: "wang", password: "1024"}
同时结构体支持定义方法
func (u user) checkPassword(password string) bool {
return u.password == password
}
func (u *user) resetPassword(password string) {
u.password = password
}
上方定义了两个方法,分别是检查密码是否一致,和重置密码的方法。可以看到,由func关键词定义了一个函数,后面跟着一个括号(u user)和(u *user),在这里定义了,这个方法是属于哪个结构体的。而这两个方法,却有一个*的区别,这便是Go语言中的指针。
使用了(u *user)的方法,代表这里的u变量,是一个内存指针变量,和C语言中的指针类似。对它进行操作,例如这里的resetPassword,在重新给password变量赋值后,其自身的值也会跟着修改,例如在下面的代码中,我们先对它重置密码,再使用检查密码是否一致,会输出true。
a.resetPassword("2048")
fmt.Println(a.checkPassword("2048")) // true
日期处理
在学习日期处理的时候,个人觉得比较有意思的是在go语言中,并没有像Java的SimpleDateFormat那样,需要定义好类似yyyy-MM-dd之类的格式化字符串,取而代之,go中直接使用2006-01-02 15:04:05定义了日期的格式。
其他的,可以使用time包中的各种函数,获取时间戳、获取日期等等的操作,与其他语言类似。
项目实战
在项目实战中,主要介绍了猜数字,访问rest接口获取翻译,手动实现socks代理的一个功能。
个人觉得比较有意思的是实现socks5代理的部分。在这个项目中,我了解到了socks5的代理的通信机制,也初步接触了go中的socket相关编程的知识。socks5作为平时经常使用的一个代理协议,平时却从来没有关注过他的实现,通过课程的学习让我觉得socks5非常有意思,同时平时也需要具备一定的钻研精神,知其然,也要知其所以然。