Go语言使用小技巧-包管理以及依赖管理
1. 自动增减包的工具
由于Go语言在编译时会对引入的包做检查,没有使用到的包会报错。而当使用了否个报下的函数时只要自动引入其所在的包的功能,而没有当移除这个函数时连带着引入的包一同删掉的问题,为了解决这个问题。可以借助一些工具。
集成goimports工具及方法:
- 打开终端输入指令:
go get golang.org/x/tools/cmd/goimports
- Gogland ->Preferences->Languages & Framworks->Go->On Save “On save run” choose go imports
- Gogland ->Preferences->Languages & Framworks->Go->Imports
“Sorting Type” choose goimports
ps:我自己使用的IDE是Goland
2. 格式化Go原文件
gofmt工具(gofmt或go fmt)可以帮助开发者格式化他们的代码到统一的风格。gofmt是一个cli程序,会优先读取标准输入,如果传入了文件路径的话,会格式化这个文件,如果传入一个目录,会格式化目录中所有.go文件,如果不传参数,会格式化当前目录下的所有.go文件。
gofmt默认不对代码进行简化,使用-s参数可以开启简化代码功能,具体来说会进行如下的转换:
去除数组、切片、Map初始化时不必要的类型声明:
1 | //如下形式的切片表达式: |
去除数组切片操作时不必要的索引指定:
1 | //如下形式的切片表达式: |
去除迭代时非必要的变量赋值:
1 | //如下形式的迭代: |
gofmt命令参数列表如下:
1 | usage: gofmt [flags] [path ...] |
有如下内容的Golang程序,存储在main.go文件中
1 | package main |
用以下规则来格式化上面的代码。gofmt -r "a + b -> b + a"
格式化的结果如下:
1 | package main |
go fmt和gofmt
gofmt是一个独立的cli程序,而go中还有一个go fmt命令,go fmt命令是gofmt的简单封装。
1 | usage: go fmt [-n] [-x] [packages] |
go fmt命令本身只有两个可选参数-n和-x,-n仅打印出内部要执行的go fmt的命令,-x命令既打印出go fmt命令又执行它,如果需要更细化的配置,需要直接执行gofmt命令。
go fmt在调用gofmt时添加了-l -w参数,相当于执行了gofmt -l -w。
goland中配置gofmt
在Goland中,可以通过添加一个File Watcher来在文件发生变化的时候调用gofmt进行代码格式化,具体方法是,点击Preferences -> Tools -> File Watchers,点加号添加一个go fmt模版,Goland中预置的go fmt模版使用的是go fmt命令,将其替换为gofmt,然后在参数中增加-l -w -s参数,启用代码简化功能。添加配置后,保存源码时,goland就会执行代码格式化了。
3.go依赖管理-govendor
Golang 官方并没有推荐最佳的包管理方案。到了1.5版本时代,官方引入包管理的设计,加了 vendor 目录来支持本地包管理依赖。官方 wiki 推荐了多种支持这种特性的包管理工具,如:Godep、gv、gvt、glide、govendor等。
govendor该工具将项目依赖的外部包拷贝到项目下的 vendor 目录下,并通过 vendor.json 文件来记录依赖包的版本,方便用户使用相对稳定的依赖。
对于 govendor 来说,依赖包主要有以下多种类型:
状态 | 缩写状态 | 含义 |
---|---|---|
+local | l | 本地包,即项目自身的包组织 |
+external | e | 外部包,即被 $GOPATH 管理,但不在 vendor 目录下 |
+vendor | v | 已被 govendor 管理,即在 vendor 目录下 |
+std | s | 标准库中的包 |
+unused | u | 未使用的包,即包在 vendor 目录下,但项目并没有用到 |
+missing | m | 代码引用了依赖包,但该包并没有找到 |
+program | p | 主程序包,意味着可以编译为执行文件 |
+outside | 外部包和缺失的包 | |
+all | 所有的包 |
3.1 安装
编译一个govendor
1 | go get -u github.com/kardianos/govendor |
The project must be within a $GOPATH/src
3.2 Quick Start
1 | # 设置你的工程 |
3.3 Sub-commands
1 | init 创建 vendor 文件夹和 vendor.json 文件 |