Go语言基础以及实战案例 | 青训营笔记

132 阅读6分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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,如果我们不需要索引的话,我们可以用下划线来忽略。

函数

image.png

golang支持函数返回多个值,但实际业务中一般返回两个,一个结果,一个错误信息。

指针

image.png

指针在golang中主要作用就是对传入参数进行修改,如图所示,若没有指针,修改的是拷贝。

结构体

image.png

结构体在golang中一定程度上充当了class的角色,是带类型的字段集合,初始化方法如图所示。

image.png

结构体也可以声明方法,类似于类成员函数,声明方式如图所示,可以带指针也可以不带。

错误处理

image.png

正如函数那部分所讲,在开发中习惯使用单独的返回值来传递错误信息,用if err!= nil 来判断错误并进行处理。

3.标准库

字符串

  • 在标准库strings中有许多实用的函数,比如contains,count, index,join等多个顾名思义的函数。
  • fmt标准库中的Printf()函数可以进行字符串格式化,可以使用%v来打印任意类型的变量,十分方便。

json处理

image.png

  • 在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来获取、修改环境变量。

三、实践练习例子

猜数游戏

code.png 猜数游戏是系统生成一个随机数,用户进行猜测,根据系统提示的偏大偏小来决定下一次猜测数值。主要难点在于数字的读入以及设置每次随机数的种子。

在线词典

code1.png 在线词典是用go语言发送http请求,以便于获取用户输入英文单词的音标以及汉语解释等信息,主要难点在于翻译网站的网络抓包,相关结构体的构造以及相关请求代码的生成。

socks5代理

image.png SOCKS5 是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全。协议过程主要分为6步,如图所示。本例想要用go语言来实现一个简易的socks5代理功能。 code2.png 代码如图所示,这里主要难点在于引入了goroutine机制,以及验证和连接过程中相关字段的获取,有定长也有变长,需要仔细处理。

四、课后个人总结

综合本节课来看,golang的语法并不困难,但相关业务逻辑的实现还需要进一步熟练,尤其是json数据处理和goroutine、数据输入输出等方面,目前还不太理解context、<-符等知识的运用,还需要进一步的学习。