go get
go get
为当前开发的模块解析并添加依赖,然后构建并安装依赖。
添加依赖
上策:查找最新的打标签的发布版本。
中策:打标签的预发布版。
下策:最新的已知提交版本。
例如:go get golang.org/x/text@v1.2.3
,其中 @v1.2.3 可以是标签,分支名或者其他版本系统标识。注意:分支名字与其他模块查询语法冲突,则不能显式地选择分支名。
- @laset
示例go get golang.org/x/text@laset
,显式要求使用指定路径命名的模块的最新的次版本的发布版本 - @upgrade
示例go get golang.org/x/text@upgrade
,如果当前已被依赖要求使用比最新的发布版本较新的修订版本或预发布版本,将不会降级模块。 - @patch
示例go get golang.org/x/text@@patch
,和当前依赖要求的版本有相同主版本和次版本的最新发布版本。当已依赖要求使用较新的版本时,不会降级模块。
虽然get默认使用包含命名包的模块的最新版本,但其不会使用该模块的依赖模块的最新版本。
安装名字包
-d:下载构建指定名字的包所需的源代码,包括下载所需的依赖的源代码,但不构建和安装它们。
-insecure:允许使用如HTTP等不安全的方案,从仓库拉取以及解析自定义域名。
-t:同时添加命令行中指定的包构建测试所需的模块。
-u:同时更新命令行中指定的包的依赖模块,令依赖模块使用更新的次版本的发布版本或补丁版本的发布版本,前提是这些版本可获得。
-u=patch:(不同于-u)同样更新依赖模块,但不同之处在于默认选择补丁版本的发布版本。
当-t和-u一起使用时,将也会更新构建测试所需的模块的依赖模块。
如果没有指定包名参数,“go get”使用当前目录下的Go包,如果有的话。特别地,“go get -u”和“go get -u=patch”更新该包的所有依赖。
gitlab私有包
http服务使用如下命令获取包go get -insecure mygitlab.com/user/repo
,
- 创建token
gitlab用户添加token<Gitlab> -> <Settings> -> <Access Tokens>
开发环境配置gitlab tokengit config --global http.extraheader "PRIVATE-TOKEN: gDybLx3yrUK_HLp3qPjS"
- 配置git请求从ssh转http
`git config --global url."git@gitlab.com:".insteadOf "https://gitlab.com/"`` - 测试
go get -u -v gitlab.com/userName/projectName
go build
go help build
=> usage: go build [-o output] [-i] [build flags] [packages]
测试源码
[test@localhost go]$ ls
dep go.mod go.sum main.go mylog
[test@localhost go]$ tree
.
├── dep
│ └── dep.go
├── go.mod
├── go.sum
├── main.go
└── mylog
├── mylog.go
└── mylog_test.go
测试源码
[test@localhost go]$ cat mylog/mylog.go
package mylog
import (
"fmt"
"pratice/dep"
)
type Mylog struct {
Log dep.TLog
}
func NewMylog(level int) *Mylog {
return &Mylog{
Log: dep.TLog{
Level: level,
},
}
}
func (ml *Mylog) Tracef(format string, args ...interface{}) {
fmt.Printf(format, args...)
}
[test@localhost go]$ cat dep/dep.go
package dep
import "fmt"
type TLog struct {
Level int
}
func (lg *TLog) PrintLog(level int, format string, args ...interface{}) {
if level > lg.Level {
fmt.Printf(format, args...)
}
}
命令解析
-
go build pratice/mylog
mylog模块依赖pratice/dep模块,此命令编译将会检查这两个模块的语法错误。同时忽略mylog_test.go文件。此处也可以指定文件名进行语法检查。 -
go build main.go
编译项目main模块,将根据第一个文件主文件名生产可执行文件名。测试示例生成的为main(windows将生成main.exe,windows添加.exe后缀)。
参数描述
参数 | 描述 | 备注 |
---|---|---|
-i | 安装编译模块的依赖 | |
-n | 打印需要执行的命令,但是不执行 | |
-p | 构建并行数 | 默认cpu个数 |
-race | 开启数据竞争检查 | linux/amd64,... |
-msan | 开启内存分析检查 | linux/amd64,... |
-v | ||
-work | 构建的临时目录 | 结束并不会删除 |
-x | 输出构建的临时目录 | 结束删除构建目录,默认选项 |
-asmflags | 参数通过go工具提供 | -asmflags '[pattern=]arg list' |
-buildmode | 构建mode | 详情见: go help buildmode |
-compiler | 指定编译器 | gccgo或者gc |
-gccgoflags | gccgo编译器指定参数 | -gccgoflags '[pattern=]arg list' |
-gcflags | gc编译器指定参数 | -gcflags '[pattern=]arg list' |
-installsuffix-installsuffix | ||
-ldflags | 编译时进行参数传递 | -ldflags '[pattern=]arg list' |
-linkshared | 共享库连接 | |
-mod | 指定编译mode | readonly, vendor, or mod |
-modcacherw | ||
-modfile | 指定特定的go.mod编译项目,go.mod指定了依赖包的版本 | -modfile file |
-pkgdir | 从指定的dir加载包,而不是使用默认路径 | -pkgdir dir |
-tags | -tags tag,list | |
-trimpath | build生成文件中异常构建的绝对路径替换为module path@version
|
|
-toolexec | -toolexec 'cmd args' |
-asmflags, -gccgoflags, -gcflags, and -ldflags
命令参数使用 空格 间隔
- go build -ldflags
-s: 去掉符号表
-w: 去掉调试信息,此时服务不能dlv
go build -mod=vendor -ldflags " -X 'pratice/dep.AppName=PRATICE'" .
# pratice/dep 包中添加全局变量,通过上述命令初始化
- go build -tags
go build -tags "debug linux"
log_pipe.go
// +build debug
// +build linux
/* <=> */
// +build debug AND linux
package xxx
规则:
- 多个条件之间,空格表示OR;逗号表示AND;叹号(!)表示NOT 。
- 一个文件可以有多个+build,它们之间的关系是AND 。
- +build必须出现在package语句之前,+build注释之后应要有一个空行。
go list
go help list
= > usage: go list [-f format] [-json] [-m] [list flags] [build flags] [packages]
-
go list
在项目的根目录,go.mod目录,输出moudle名称
go list -f {{.xxx}}
根据语法模板输出
go list -f '{{.Dir}}' github.com/go-redis/redis/v8
type Package struct {
Dir string // 输出给定包的本地下载路径
ImportPath string // 引用包使用的包名
ImportComment string // path in import comment on package statement
Name string // 包名
Doc string //
Target string // install path
Shlib string // the shared library that contains this package (only set when -linkshared)
Goroot bool // is this package in the Go root?
Standard bool // is this package part of the standard Go library?
Stale bool // would 'go install' do anything for this package?
StaleReason string // explanation for Stale==true
Root string // 项目的绝对路径
ConflictDir string // this directory shadows Dir in $GOPATH
BinaryOnly bool // binary-only package (no longer supported)
ForTest string // package is only for use in named test
Export string // file containing export data (when using -export)
Module *Module // info about package's containing module, if any (can be nil)
Match []string // command-line patterns matching this package
DepOnly bool // package is only a dependency, not explicitly listed
// Source files
GoFiles []string // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
CgoFiles []string // .go source files that import "C"
CompiledGoFiles []string // .go files presented to compiler (when using -compiled)
IgnoredGoFiles []string // .go source files ignored due to build constraints
CFiles []string // .c source files
CXXFiles []string // .cc, .cxx and .cpp source files
MFiles []string // .m source files
HFiles []string // .h, .hh, .hpp and .hxx source files
FFiles []string // .f, .F, .for and .f90 Fortran source files
SFiles []string // .s source files
SwigFiles []string // .swig files
SwigCXXFiles []string // .swigcxx files
SysoFiles []string // .syso object files to add to archive
TestGoFiles []string // _test.go files in package
XTestGoFiles []string // _test.go files outside package
// Cgo directives
CgoCFLAGS []string // cgo: flags for C compiler
CgoCPPFLAGS []string // cgo: flags for C preprocessor
CgoCXXFLAGS []string // cgo: flags for C++ compiler
CgoFFLAGS []string // cgo: flags for Fortran compiler
CgoLDFLAGS []string // cgo: flags for linker
CgoPkgConfig []string // cgo: pkg-config names
// Dependency information
Imports []string // import paths used by this package
ImportMap map[string]string // map from source import to ImportPath (identity entries omitted)
Deps []string // all (recursively) imported dependencies
TestImports []string // imports from TestGoFiles
XTestImports []string // imports from XTestGoFiles
// Error information
Incomplete bool // this package or a dependency has an error
Error *PackageError // error loading package
DepsErrors []*PackageError // errors loading dependencies
}
-
go list -dep github.com/go-redis/redis
查看包redis依赖的包 -
go list -compiled -json github.com/go-redis/redis
查看redis包的详细信息 go list -dep -json github.com/go-redis/redis
-
go list -find test
验证包是否存在; go list -find github.com/go-redis/redis -
go list -m github.com/go-redis/redis
-m :可以理解为modules列表操作。
go list -json -m github.com/go-redis/redis
列出本地缓存依赖包的信息
go list -f '{{.String}}' -m github.com/go-redis/redis
go list -m -u all
列出可升级版本信息 详情查看:go list -m -u -json all
go clean
usage: go clean [clean flags] [build flags] [packages]
删除由源文件生成的目标文件,go build
产生的目标文件大部分在临时文件中,因此go clean
处理的主要是其他工具产生的文件。
go clean 参数描述
go clean -i -r
_obj/ old object directory, left from Makefiles
_test/ old test directory, left from Makefiles
_testmain.go old gotest file, left from Makefiles
test.out old test log, left from Makefiles
build.out old test log, left from Makefiles
*.[568ao] object files, left from Makefiles
DIR(.exe) from go build
DIR.test(.exe) from go test -c
MAINFILE(.exe) from go build MAINFILE.go
*.so from SWIG
参数 | 描述 | |
---|---|---|
-i | 删除go create创建的数据 | |
-n | 打印删除的命令当但是不执行 | |
-r | 递归清理项目依赖的包 | |
-x | 打印并执行清除命令 | |
-cache | 清除go build cache数据 | |
-testcache | 清除所有到期的测试结果 | |
-modcache | 清理并删除项目缓存的包模块 | 慎用 |
go clean -n -modcache
go clean -i -n
go clean -i -x
- 示例
[test@localhost cmd-go]$ pwd
/home/test/practice/cmd-go
[test@localhost cmd-go]$ go clean -i -n
cd /home/test/practice/cmd-go
rm -f cmd-go cmd-go.exe cmd-go.test cmd-go.test.exe main main.exe
rm -f /home/test/MyTool/goide/gopath/bin/pratice
go tool
go tool cover
-
go test -coverprofile=aut-cover.out
生成测试结果集。 -
go tool cover -html=aut-cover.out -o /opt/coverage/aut-logger.html
将结果转换为html测试覆盖结果。 -
go tool cover -func=aut-cover.out
输出每个函数的测试覆盖率。
参数 | 描述 | 备注 |
---|---|---|
-func | 根据测试集输出函数的测试覆盖率 | |
-html | 将测试集转换为html数据 | |
-o | 根据测试集转换覆盖率的输出位置 |
go tool doc
在项目的包中执行 go tool doc
数据当前go源码的文档解析;go tool doc github.com/ydbt/devtool/logger
输出模块包的源码文档信息。
go tool
go test
go help testflag
查看go test
执行的参数选项。
测试控制参数
参数格式 | 描述 | 备注 |
---|---|---|
-bench regexp | 压力测试 | 匹配Benchmark_之后的任意字符串 |
-benchtime t | 压力测试持续时间或者调用次数 | 默认1秒,1h1m1s、Nx(b.N=N) |
-count n | 调用测试用例次数 | 默认1次 |
-cover | 通过测试注解源文件统计覆盖率 | 测试失败对覆盖率有影响 |
-covermode set,count,atomic | set: bool: does this statement run? count: int: how many times does this statement run? atomic: int: count, but correct in multithreaded tests; |
默认为set |
-coverpkg pattern1,pattern2,pattern3 | 覆盖率分析匹配导入包 | |
-cpu 1,2,4 | 默认为GOMAXPROCS | |
-failfast | 只有当上一次测试成功才进行下一轮 | count>1时 |
-list regexp | 列出正则匹配的单元测试但是不执行 | |
-parallel n | 并行执行测试用例 | 默认值为GOMAXPROCS |
-run regexp | 运行的测试用例的正则匹配 | |
-timeout d | 测试执行 超时设置 | 默认10分钟 |
-v | 输出测试中的标准输出 |
测试监控参数
参数格式 | 描述 | 备注 |
---|---|---|
-benchmem | 压力测试输出内存统计信息 | |
-blockprofile block.out | goroutine bolcking profile 输出到文件 | |
-blockprofilerate n | ||
-coverprofile cover.out | 测试覆盖率集输出到文件 | |
-cpuprofile cpu.out | 测试CPU信息接到文件 | |
-memprofile mem.out | 内存分配分析 | |
-memprofilerate n | ||
-mutexprofile mutex.out | 锁分析 | |
-mutexprofilefraction n | ||
-outputdir directory | profile输出文件路径 | 默认为: 执行go test 目录 |
-trace trace.out |
go test -bench=Calc -benchtime 111x -count 2 -v
测试示例
fibonacci.go
package fibonacci
type Fibonacci struct {
Result int
Len int
}
func (fb *Fibonacci)CalcFibonacci() int{
fb.Result = calc_fb(fb.Len)
return fb.Result
}
func calc_fb(b int) int{
if b <= 1 {
return 1
}
return calc_fb(b-1) + calc_fb(b-2)
}
fibonacci_test.go
package fibonacci_test
import(
"testing"
"pratice/fibonacci"
)
func TestCheck(t *testing.T) {
var fb fibonacci.Fibonacci
fb.Len = 0
fb.Result = 0
fb.CalcFibonacci()
if fb.Result != 1 {
t.Error("fibonacci(0) != 1")
}
fb.Len = 1
fb.CalcFibonacci()
if fb.Result != 1 {
t.Errorf("fibonacci(%d)=%d",fb.Len,fb.Result)
}
fb.Len = 2
fb.CalcFibonacci()
if fb.Result != 2 {
t.Errorf("fibonacci(%d)=%d",fb.Len,fb.Result)
}
fb.Len = 20
fb.CalcFibonacci()
if fb.Result != 10946 {
t.Errorf("fibonacci(%d)=%d",fb.Len,fb.Result)
}
}
func Benchmark_Calc(b *testing.B) {
for i := 0 ; i < b.N ; i++ {
fb := fibonacci.Fibonacci{
Len: 20,
Result:0,
}
fb.CalcFibonacci()
}
}