这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
1.知识要点
本节课的知识要点包括GO语言的基础语法和3个入门实践。
2.GO基础语法
2.1 强类型语言
GO是一种强类型语言,比如var b int = 1。若不显示声明的话,会自动进行类型解析,比如var a = “initial”。
2.2 仅for循环
在GO当中只有for一种循环,官方比较推荐的写法是for-range写法。其中,index为数组索引,value为数组对应的值,若不需要可以用_替代,表示留空。
for index, value := range mybuf {
......
}
2.3 去除不必要的括号
GO语言中if后面的判断条件不需要加括号。
2.4 switch-case自动break
每个case的对应语句执行完成会自动结束,不会像Java那样、若没有break就继续顺序执行下面的case。
2.5 map
map可以说是一些考虑时间效率的场景下非常重要的数据结构了,GO语言中map的用法更简洁,有点类似于numpy中的索引用法。
m := make(map[string]int)
m["one"] = 1
fmt.Println(m["one"]) // 1
2.6 结构体
结构体作为函数的参数时,有两种写法:
如果是只读,那么以u user形式传入就行。
如果想要修改,就需要传入指针u *user。
type user struct {
name string
password string
}
func (u user) checkPassword(password string) bool {
......
}
func (u *user) resetPassword(password string) {
......
}
2.7 json
序列化常用的方法是json.Marshal,
反序列化常用的方法是json.Unmarshal。
3.实践项目
3.1 猜谜游戏
这个游戏的实现思路比较简单,总体可以分为两个部分,第一部分是生成随机数,第二部分是一个无限循环的猜词过程,直到用户猜中。
生成随机数时,注意要传入随机数种子,才能得到真随机数。
猜词首先就是要读取用户输入,这个过程中我踩了一个小坑,用ReadString读进来一行后,要去掉末尾的空白符,不仅仅是\n,而是\r\n。
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
continue
}
input = strings.TrimSuffix(input, "\r\n")
然后转成数字比大小,给用户对应提示。
3.2 简单词典
这个项目练习的核心点是发起https请求,并处理对应的返回数据。
序列化和反序列化都涉及到结构体,我们可以借助在线转换器,将抓包内容转换成对应的结构体。
3.3 SOCKS5
这个项目是跟着老师一步步做的,不过遇到了点问题,net.dial似乎无法用来访问IPV6地址和端口,希望之后解决了回来填坑。