Go语言是一种跨平台(Mac OS、Windows、Linux 等)的静态编译型语言。拥有媲美C语言的强大性能,支持静态类型安全,在普通计算机上能几秒内快速编译一个大项目,开发效率跟动态语言相差无几。
Go语言在国内拥有非常活跃的社区,未来发展十分看好。当前Go语言主要应用于后端服务的开发,未来随着Go项目的完善,在系统、游戏、UI界面、AI、物联网等领域,都将被广泛使用。
当我们在开发实现中需要引入第三方包的解决方案的时候,就需要对于Go语言第三方包进行下载,引入及版本管理。Go语言拥有很多优秀的第三方包,在后端技术的解决方案上面,第三方包的使用可以实现相应功能需求,而且便于安装与引用。
01
管理及使用
1、第三方包的安装
(1)使用go get 安装
在互联网环境下,可以直接通过go get命令进行第三方包的安装。
比如要安装 github.com/gin-gonic/gin 则可以通过以下命令:
需要注意的是,执行go get 命令需要先安装git命令,并配置好git全局变量。
(2)使用源码包安装
由于国内网络问题,很多时候go get命令并不能安装,所以就需要到github.com网站上面手动下载源码包,然后拷贝到相应的工程目录中进行引用。
比如要安装 github.com/golang/protobuf/proto
需要去github.com/golang/protobuf下载源码包,解压之后拷贝到工程目录中,以供以后程序开发及编译时使用。
需要注意的是,GO 和Java 不同,所有import的包必须在%GOPATH路径下,如果直接导入源码路径下的包,编译会报错。因为GO只会在$GOPATH 下找包的依赖,而不会在当前工程下找。如果新加入的第三方包是与工程目录脱离,则在使用或编译之前需要将第三方包所在的目录加入到$GOPATH中。
2、管理办法
第三方包的管理方案有很多种,之前出现过dep和vendor。但是自从在1.11版本初步引入GoModule模块之后,1.12版本开始正式支持。GoModule是官方提供的包管理解决方案。通过GoModule,开发者可以把工程放在GOPATH之外的位置,使管理更加灵活。
使用GoModule管理依赖后会在项目根目录下生成两个文件go.mod和go.sum。
(1)变量设置
要启用GoModule支持首先要设置环境变量GO111MODULE,通过它可以开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是auto。
设置GO111MODULE=on之后就可以使用GoModule了,编译时会忽略GOPATH和vendor文件夹,只根据go.mod下载依赖。
因为需要互联网环境进行管理,在国内网络环境下,部分第三方包无法正常下载,所以建议设置代理参数GOPROXY,推荐设置为https://goproxy.cn。
(2)常用命令
初始化相关的命令如下:
通过go mod init命令初始化当前文件夹, 创建go.mod文件。go.mod文件记录了项目所有的依赖信息,文件内容大致如下:
其中,module用来定义包名,require用来定义依赖包及版本,indirect表示间接引用。
(3)管理依赖包
在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。
如果下载所有依赖可以使用go mod download命令。
我们在代码中删除依赖代码后,相关的依赖包并不会在go.mod文件中自动移除。这种情况下我们可以使用go mod tidy命令更新go.mod中的依赖关系。
如果需要对一个已经存在的项目启用GoModule,可以按照以下步骤操作:
3、引用方式
在应用程序中直接import即可。
比如要使用 github.com/gin-gonic/gin 则在引用文件中使用以下引用代码即可:
02
介绍与应用
下面介绍几类常用的第三方包的使用场景及应用示例。
1、数据加密
github.com/ZZMarquis/gm
使用场景:实现国密SM2/SM3/SM4算法;实现SM2 X509v3证书签发和解析。
开源代码Star数:★96
使用方式:
国密sm3加密实现,示例如下:
国密sm4加密实现,示例如下:
golang.org/x/crypto
使用场景:crypto密码学的补充包。Pbkdf2非对称算法的go实现。
开源代码Star数:★1.7K
使用方式:
Pbkdf2非对称算法,示例如下:
2、文件读取
github.com/spf13/viper
使用场景:获取配置文件内容。
开源代码Star数:★11.4K
使用方式:
配置文件内容如下:
配置文件内容读取,示例如下:
github.com/spf13/cast
使用场景:获取配置文件列表内容。
开源代码Star数:★858
使用方式:
配置文件内容如下:
配置文件内容读取,示例如下:
github.com/LindsayBradford/go-dbf/godbf
使用场景:dbf文件内容解析。
开源代码Star数:★50
使用方式:
dbf文件内容解析,示例如下:
3、信息通信
github.com/golang/protobuf/proto
使用场景:protobuf支持的补充包。
开源代码Star数:★6.3K
使用方式:通过protoc-gen-go文件指令进行proto文件编译生成的go文件内部使用
protobuf结构解析,示例如下:
github.com/dgrijalva/jwt-go
使用场景:进行token生成及管理。
开源代码Star数:★7.2K
使用方式:
token管理,示例如下:
github.com/gorilla/websocket
使用场景:创建websocket链接。
开源代码Star数:★11.3K
使用方式:
创建websocket链接,示例如下:
4、数据库操作
github.com/mattn/go-sqlite3
使用场景:xorm推荐的sqlite数据库driver包。
开源代码Star数:★3.9K
使用方式:
初始化数据库,示例如下:
github.com/mattn/go-oci8
使用场景:xorm推荐的oracle数据库driver包。
开源代码Star数:★3.9K
使用方式:
初始化数据库,示例如下:
github.com/go-sql-driver/mysql
使用场景:xorm推荐的mysql数据库driver包。
开源代码Star数:★9.3K
使用方式:
初始化数据库,示例如下:
5、基础框架包
除了以上提到的Go语言第三方包之外,还有一些比较常用的基础框架包,比如:
github.com/gin-gonic( 高性能的web 框架)
github.com/go-xorm(gin web框架推荐使用的ORM数据库中间件)
google.golang.org/grpc(grpc协议通信)
由于应用比较广泛,范例也比较多,此处不再冗述。
03
总结
开源包的引入在一定程度上解决了日常开发的方案需求,但是加入开源包的使用也对项目开发带来了一定的风险。在对开源包进行使用之前,一定要对开源包的功能、版本以及使用评价有一定的了解。
● 可通过开源网站的访问量、星级标识及更新时间进行质量评估,翻看更新记录及反馈查看使用情况。
● 可通过GoModule管理方案进行版本管理,并跟踪最新版本更新情况。
● 可通过开源包中的test文件查看使用方式,查看内部逻辑,对于代码结构设计可以深入研究了解,必要的时候可按照实际情况进行维护。
在对开源包方案进行选型的时候,要对内部的实现逻辑进行充分的了解和研究,防止增加项目的不确定风险。引入开源包之后需要定时去关注版本变化,监控是否发现或解决了某些严重缺陷,或者升级优化了某些功能。最终确保做到可使用可维护,能够不留后患的解决问题。