初识Go | 青训营笔记

105 阅读4分钟

这是我参与「第五届青训营」笔记创作活动的第1天

安装Go和配置开发环境

Git

由于课程中的示例代码都是使用Git,通过Github进行托管的。并且,我们后面也需要进行大作业的协作开发,同样也需要使用到Git。所以首先我们就需要安装好Git这个软件,并通过Github配置SSH私钥,让我们能正常通过SSH访问github。

具体步骤大致如下:

  1. 生成RSA密钥对,将公钥文件添加到Github设置页面。
  2. 将秘钥文件,复制到~/.ssh/id_rsa
  3. 打开命令行,使用命令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的学习。

image.png

Go基础语法

在这里只记录了我个人认为和其他语言区别较大,需要区分的地方。

变量赋值

Go语言在赋值这一块和Python 新版本Java比较类似,可以不指定类型直接定义变量

var a = "initial"  // 使用var关键词
b := a  // 不使用var关键词

也可以在变量名后跟上类型名,对变量的类型进行指定

var b, c int = 1, 2

常量只需要更换关键词varconst

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非常有意思,同时平时也需要具备一定的钻研精神,知其然,也要知其所以然。