go命令

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

规则:

  1. 多个条件之间,空格表示OR;逗号表示AND;叹号(!)表示NOT 。
  2. 一个文件可以有多个+build,它们之间的关系是AND 。
  3. +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

  1. go test -coverprofile=aut-cover.out生成测试结果集。
  2. go tool cover -html=aut-cover.out -o /opt/coverage/aut-logger.html将结果转换为html测试覆盖结果。
  3. 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()
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

  • go build 这个命令主要用于编译代码。在包的编译过程中,若有必要,会同时编译与之相关联的包。 如果是普通包,...
    今早上阅读 625评论 0 3
  • 一、Go的源码文件 Go 的源码文件分类: 如上图,分为三类: 1、命令源码文件: 声明自己属于 main 代码包...
    qfliweimin阅读 443评论 0 0
  • 假如你已安装了golang环境,你可以在命令行执行go命令查看相关的Go语言命令: go env用于打印Go语言的...
    weifansym阅读 835评论 0 0
  • 迁移自CSDN:http://blog.csdn.net/erlib/article/details/527031...
    Sunface撩技术阅读 2,133评论 0 7
  • 本文转载自:https://blog.csdn.net/wuya814070935/article/details...
    周紫一阅读 831评论 0 1