GO语言入门 | 青训营笔记

283 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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地址和端口,希望之后解决了回来填坑。