这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天。
今天也是青训营开始的第一天,在观看完学习视频并跟着做了一些练习之后,我感到收获颇丰,下面就来总结一下。
一、本堂课重点内容:
- 简要介绍了Go语言的八大优势以及广泛的应用前景
- 从开发环境、基础语法、标准库三个方面介绍了Go语言的开发入门,对比了与其他语言的不同之处。
- 利用三个案例:猜数游戏、在线词典、socks5代理揭开了Go语言开发的神秘面纱。
二、详细知识点介绍:
Go语言简介
Go语言的八大优势
- 高性能、高并发 很适合于Web编程
- 语法简单、学习曲线平缓 便于上手,可以进行快速开发。
- 丰富的标准库 可以不过度依赖于第三方库进行高性能功能的开发。
- 完善的工具链 可以定制个性化编译链接过程。
- 静态链接 不需要类似于java的jkd此类工具。
- 快速编译 编译速度快于java等语言
- 跨平台 跨平台机制完善,可以快速部署到各个平台上。
- 垃圾回收 不需要手动管理内存,具有自动回收机制。
Go语言广泛前景
从业务维度看国言已经在云计算、微服务、大数据、区块链、物联网等领域蓬勃发展。然后在云计算、微服务等领域已经有非常高的市场占有率Docker、Kubernetes、Istio、etcd、prometheus几乎所有的云原生组件全是用Go实现的。在国内已被字节跳动、腾讯、百度等企业采用大量使用,在国外也有google、Facebook等公司在使用。前景十分广阔。
Go语言入门
1.开发环境
可以使用集成开发环境vscode、goland等软件,也可以使用基于云的开发环境gitpods
2.基础语法
变量
可以由var声明,也可以用:=声明,类型可以自主声明也可以由go语言自行判断。
分支语句
- if else 写法和cpp类似,但条件语句没有小括号,同时大括号是必须的。
- switch 写法也和cpp类似,但更为强大,同样不需要小括号,而且每个分支不需要加break,变量类型也是任意的。
循环语句
与其他语言不同,golang只有for这一个循环语句,除了小括号之外其他语法都类似于cpp。
数组
可以由类似 var a[5] int 这样的语句来声明,其他操作都类似于cpp。在真实业务代码里面,golang很少直接使用数组,因为它是定长的,用的更多的是切片。
切片
切片不同于数组可以任意更改长度,而且操作也更为丰富。可以使用make语句来创建切片,可以像数组一样取值,也可以用append来追加元素,像python一样可以取出一个范围的元素,但不支持负数索引。
map
同样使用make来创建:make(map[string]int) 括号内为k外为v。使用delete来删除。
range
语法类似python,可以使用range来快速遍历切片或map,如果我们不需要索引的话,我们可以用下划线来忽略。
函数
golang支持函数返回多个值,但实际业务中一般返回两个,一个结果,一个错误信息。
指针
指针在golang中主要作用就是对传入参数进行修改,如图所示,若没有指针,修改的是拷贝。
结构体
结构体在golang中一定程度上充当了class的角色,是带类型的字段集合,初始化方法如图所示。
结构体也可以声明方法,类似于类成员函数,声明方式如图所示,可以带指针也可以不带。
错误处理
正如函数那部分所讲,在开发中习惯使用单独的返回值来传递错误信息,用if err!= nil 来判断错误并进行处理。
3.标准库
字符串
- 在标准库strings中有许多实用的函数,比如contains,count, index,join等多个顾名思义的函数。
- fmt标准库中的Printf()函数可以进行字符串格式化,可以使用%v来打印任意类型的变量,十分方便。
json处理
- 在encoding/json库中也提供了十分丰富的函数来处理json数据。
- 保证结构体首字母大写就可以使用JSON.marshaler来序列化结构体,使其变为json数据;使用JSON.unmarshaler来反序列化。
- 可以使用json tag语法来修改输出的json字段名。
时间处理
- time标准库提供了很丰富的工具函数,例如time.Now()来获取当前时间,time.Date()构造时间。
- 可以很方便的用.UNIX获取时间戳,用.Year() .Month() .Day()等函数获取年月日等。
数字解析
在strconv标准库中提供了字符串和数字的一系列相互转换,函数命名类似于java,比如ParseInt()将字符串转为数字,Atoi()将数字转化为字符串。
进程信息
在开发中主要用到os标准库中的os.Args来获取命令行参数,用getenv setenv来获取、修改环境变量。
三、实践练习例子
猜数游戏
猜数游戏是系统生成一个随机数,用户进行猜测,根据系统提示的偏大偏小来决定下一次猜测数值。主要难点在于数字的读入以及设置每次随机数的种子。
在线词典
在线词典是用go语言发送http请求,以便于获取用户输入英文单词的音标以及汉语解释等信息,主要难点在于翻译网站的网络抓包,相关结构体的构造以及相关请求代码的生成。
socks5代理
SOCKS5 是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全。协议过程主要分为6步,如图所示。本例想要用go语言来实现一个简易的socks5代理功能。
代码如图所示,这里主要难点在于引入了goroutine机制,以及验证和连接过程中相关字段的获取,有定长也有变长,需要仔细处理。
四、课后个人总结
综合本节课来看,golang的语法并不困难,但相关业务逻辑的实现还需要进一步熟练,尤其是json数据处理和goroutine、数据输入输出等方面,目前还不太理解context、<-符等知识的运用,还需要进一步的学习。