Skip to content

命令基础

go run 命令简介

  • 用于运行命令源码文件
  • 只能接受一个命令源码文件以及若干个库源码文件左右文件参数(我们执行go run命令时,可以后面跟多个源码文件,但是其中只能有一个源码文件作为我们源码文件的参数)
  • 其内部操作步骤是
    1. 先编译源码文件再运行
      1. 先会编译作为文件参数的源码文件
      2. 把它们的编译结果放到临时的文件夹当中
      3. 然后再去运行编译的结果
        1. 编译结果包括
          1. 命令源码文件
          2. 被编译后生成的可执行文件
          3. 以及相关库源码文件
          4. 编译后所生成的归档文件

实例来源说明

  • gic2p 项目(项目地址:http://github.com/hyper0x/goc2p
  • 项目安装:用 git clone 获取项目,并将其根目录作为一个工作区
  • ds 命令与 pds 命令 (ds用于显示指定目录的目录结构、pds用于显示指定代码包的依赖关系)
  • ds 命令源代码文件:goc2p/src/helper/ds/showds.go
  • pds 命令源代码文件:goc2p/src/helper/pds/showpds.go

go run 命令案例演示

go run 常用标记的使用

  • -a:强制编译相关代码,不论他们的编译结果是否已是最新的。
  • -n:打印编译过程中所需运行的命令,但不真正执行他们。
  • -p n:并行编译,其中 n 为并行的数量。
  • -v:列出被编译的代码包的名称。
  • -work:显示编译时创建的临时工作目录的路径,并且不删除它。
  • -x:打印编译过程中所需运行的命令。

-a 释义:如果我有一个命令源码文件,其中导入了代码包A,而这个代码包A我们在之前已经编译过,并且在编译之后代码包A中的源码没有产生任何变化,go run命令在默认情况下是不会再次编译它们,但是加入了-a标记之后,会使go再次重新编译它们。即使他们的归档文件已经存在。并且已经是最新的。

-n 释义:我们在执行 go run 命令的时候,加入 -n 标记,不会使得go run真正的去执行目标源码文件,而仅仅会打印它需要用到的额外命令,这样就可以使我们在非常安全的,不会产生任何后果的前提下查看go run命令真正的执行步骤。

-p n 释义:n为并行执行的数量,n最好为当前计算机逻辑cpu的个数(逻辑cpu的个 = 当前计算机cpu数 * 每个cpu的核数),例如 -p 4。

-v 释义:如果使用 -a -v 则会列出所有被编译的代码包的名称 1.3版本中的所有:包含Go语言自带的标准库的代码包 1.4版本中的所有:不包含Go语言自带的标准库的代码包

-work 释义:在go run命令执行完毕后不删除它(go默认在go run结束之前删除临时目录),有机会在go run结束后使我们进入目录查看

-x 释义:-n打印编译过程中所需的命令,但并不执行。-x打印编译过程中所需的命令,并执行它们

go run 常用标记案例演示

MacintoshdeMacBook-Pro-139:ds elasticnotes$ go run -x showds.go 
WORK=/var/folders/7w/0j7vff4j1kz5_g43cf_vqlg00000gp/T/go-build082935065
mkdir -p $WORK/b001/
cat >$WORK/b001/importcfg.link << 'EOF' # internal
packagefile command-line-arguments=/Users/elasticnotes/Library/Caches/go-build/80/803a90bf741cddb087a3d336b5d41b5ac5029184ef665bb9c521f34a7e54d4ce-d
packagefile flag=/usr/local/go/pkg/darwin_amd64/flag.a
packagefile fmt=/usr/local/go/pkg/darwin_amd64/fmt.a
packagefile os=/usr/local/go/pkg/darwin_amd64/os.a
packagefile path=/usr/local/go/pkg/darwin_amd64/path.a
packagefile strings=/usr/local/go/pkg/darwin_amd64/strings.a
packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
packagefile errors=/usr/local/go/pkg/darwin_amd64/errors.a
packagefile io=/usr/local/go/pkg/darwin_amd64/io.a
packagefile reflect=/usr/local/go/pkg/darwin_amd64/reflect.a
packagefile sort=/usr/local/go/pkg/darwin_amd64/sort.a
packagefile strconv=/usr/local/go/pkg/darwin_amd64/strconv.a
packagefile time=/usr/local/go/pkg/darwin_amd64/time.a
packagefile internal/fmtsort=/usr/local/go/pkg/darwin_amd64/internal/fmtsort.a
packagefile math=/usr/local/go/pkg/darwin_amd64/math.a
packagefile sync=/usr/local/go/pkg/darwin_amd64/sync.a
packagefile unicode/utf8=/usr/local/go/pkg/darwin_amd64/unicode/utf8.a
packagefile internal/oserror=/usr/local/go/pkg/darwin_amd64/internal/oserror.a
packagefile internal/poll=/usr/local/go/pkg/darwin_amd64/internal/poll.a
packagefile internal/syscall/execenv=/usr/local/go/pkg/darwin_amd64/internal/syscall/execenv.a
packagefile internal/syscall/unix=/usr/local/go/pkg/darwin_amd64/internal/syscall/unix.a
packagefile internal/testlog=/usr/local/go/pkg/darwin_amd64/internal/testlog.a
packagefile sync/atomic=/usr/local/go/pkg/darwin_amd64/sync/atomic.a
packagefile syscall=/usr/local/go/pkg/darwin_amd64/syscall.a
packagefile internal/bytealg=/usr/local/go/pkg/darwin_amd64/internal/bytealg.a
packagefile unicode=/usr/local/go/pkg/darwin_amd64/unicode.a
packagefile internal/cpu=/usr/local/go/pkg/darwin_amd64/internal/cpu.a
packagefile runtime/internal/atomic=/usr/local/go/pkg/darwin_amd64/runtime/internal/atomic.a
packagefile runtime/internal/math=/usr/local/go/pkg/darwin_amd64/runtime/internal/math.a
packagefile runtime/internal/sys=/usr/local/go/pkg/darwin_amd64/runtime/internal/sys.a
packagefile internal/reflectlite=/usr/local/go/pkg/darwin_amd64/internal/reflectlite.a
packagefile internal/unsafeheader=/usr/local/go/pkg/darwin_amd64/internal/unsafeheader.a
packagefile math/bits=/usr/local/go/pkg/darwin_amd64/math/bits.a
packagefile internal/race=/usr/local/go/pkg/darwin_amd64/internal/race.a
EOF
mkdir -p $WORK/b001/exe/
cd .
/usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/b001/exe/showds -importcfg $WORK/b001/importcfg.link -s -w -buildmode=exe -buildid=TNnYgYEUlohEjsp21ah8/JPBegBTjDKzAIrIThcbn/HerbTsixVWuJY9ArkBRD/TNnYgYEUlohEjsp21ah8 -extld=clang /Users/elasticnotes/Library/Caches/go-build/80/803a90bf741cddb087a3d336b5d41b5ac5029184ef665bb9c521f34a7e54d4ce-d
$WORK/b001/exe/showds
/Users/elasticnotes/Desktop/go_practice/goc2p/src/helper/ds:
showds.go

go build 命令简介

  • 用于编译源码文件或代码包
  • 编译非命令源码文件(库源码文件)不会产生任何结果文件,在库源码文件中 go build只是检查库的有效性。
  • 编译命令源码文件会在该命令的执行目录中生成一个可执行文件。
  • 执行该命令且不追加任何参数时,它会试图把当前目录作为代码包并编译。
  • 执行该命令且以代码包的导入路径作为参数时,该代码包及其依赖会被编译。
  • 执行该命令且以若干源码文件作为参数时,只有这些文件会被编译。

go build 命令案例演示

1
2
3
4
5
6
7
8
// 编译命令源码文件
MacintoshdeMacBook-Pro-139:ds elasticnotes$ go build showds.go 
MacintoshdeMacBook-Pro-139:ds elasticnotes$ ls
showds      showds.go
MacintoshdeMacBook-Pro-139:ds elasticnotes$ ./showds 
/Users/elasticnotes/Desktop/go_practice/goc2p/src/helper/ds:
  showds
  showds.go
1
2
3
4
5
6
7
// 编译代码包
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ pwd
/Users/elasticnotes/Desktop/go_practice/goc2p/src/pkgtool
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ go build
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ ls
envir.go    envir_test.go   fpath.go    ipath.go    pnode.go    util.go     util_test.go
↑↑↑ 用go build命令编译一个不包含命令源码文件的代码包的时候,不会产生任何输出。

go install 命令简介

  • 用于编译并安装代码包或源码文件。
  • 安装代码包会在当前工作区的 pkg / <平台相关目录> 下生成归档文件
  • 安装命令源码文件会在当前工作区的 bin 目录或 $GOBIN 目录下生成可执行文件。
  • 执行该命令且不追加任何参数时,它会试图把当前目录作为代码包并安装。
  • 执行该命令且以代码包的导入路径作为参数时,该代码包及其依赖会被安装。
  • 执行该命令且以命令源码文件及相关源码文件作为参数时,只有这些文件会被编译并安装。

go install 命令案例演示

MacintoshdeMacBook-Pro-139:ds elasticnotes$ pwd
/Users/elasticnotes/Desktop/go_practice/goc2p/src/helper/ds
MacintoshdeMacBook-Pro-139:ds elasticnotes$ go install
MacintoshdeMacBook-Pro-139:ds elasticnotes$ ls
showds.go
MacintoshdeMacBook-Pro-139:ds elasticnotes$ ls $GOBIN
ds pds

// go install命令可以运行只包含库源码文件的代码包
MacintoshdeMacBook-Pro-139:ds elasticnotes$ cd ../../pkgtool/
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ go install
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ ls
envir.go    envir_test.go   fpath.go    ipath.go    pnode.go    util.go     util_test.go
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ cd ~/goc2p/
MacintoshdeMacBook-Pro-139:goc2p elasticnotes$ cd pkg
MacintoshdeMacBook-Pro-139:pkg elasticnotes$ ds
/Users/elasticnotes/Desktop/go_practice/goc2p/pkg:
    darwin_amd64
        pkgtool.a

go get 命令简介

  • 用于从远程代码仓库(github、gitlab...)上下载并安装代码包
  • 受支持的代码版本控制系统有:Git、Mercurial(hg)、SVN、Bazaar
  • 指定的代码包会被下载到 $GOPATH 中包含的第一个工作区的 src 目录中,然后再安装他们。

go get 命令案例演示

MacintoshdeMacBook-Pro-139:~ elasticnotes$ pwd
/Users/elasticnotes
MacintoshdeMacBook-Pro-139:~ elasticnotes$ go get -x github.com/go-errors/errors
cd .
git clone -- http://github.com/go-errors/errors /Users/elasticnotes/go/src/github.com/go-errors/errors
cd /Users/elasticnotes/go/src/github.com/go-errors/errors
git submodule update --init --recursive
cd /Users/elasticnotes/go/src/github.com/go-errors/errors
git show-ref
cd /Users/elasticnotes/go/src/github.com/go-errors/errors
git submodule update --init --recursive
WORK=/var/folders/7w/0j7vff4j1kz5_g43cf_vqlg00000gp/T/go-build026618172
mkdir -p $WORK/b001/
cat >$WORK/b001/importcfg << 'EOF' # internal
# import config
packagefile bufio=/usr/local/go/pkg/darwin_amd64/bufio.a
packagefile bytes=/usr/local/go/pkg/darwin_amd64/bytes.a
packagefile errors=/usr/local/go/pkg/darwin_amd64/errors.a
packagefile fmt=/usr/local/go/pkg/darwin_amd64/fmt.a
packagefile os=/usr/local/go/pkg/darwin_amd64/os.a
packagefile reflect=/usr/local/go/pkg/darwin_amd64/reflect.a
packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
packagefile strconv=/usr/local/go/pkg/darwin_amd64/strconv.a
packagefile strings=/usr/local/go/pkg/darwin_amd64/strings.a
EOF
cd /Users/elasticnotes/go/src/github.com/go-errors/errors
/usr/local/go/pkg/tool/darwin_amd64/compile -o $WORK/b001/_pkg_.a -trimpath "$WORK/b001=>" -p github.com/go-errors/errors -complete -buildid ly4rUxmL_smBOre7YRm7/ly4rUxmL_smBOre7YRm7 -goversion go1.15.6 -D "" -importcfg $WORK/b001/importcfg -pack -c=4 ./error.go ./error_1_13.go ./parse_panic.go ./stackframe.go
/usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/_pkg_.a # internal
cp $WORK/b001/_pkg_.a /Users/elasticnotes/Library/Caches/go-build/fc/fcf98673b10ae534df999f0116a6e960a523f85134ca21ebbd7bae2509015d95-d # internal
mkdir -p /Users/elasticnotes/go/pkg/darwin_amd64/github.com/go-errors/
mv $WORK/b001/_pkg_.a /Users/elasticnotes/go/pkg/darwin_amd64/github.com/go-errors/errors.a
rm -r $WORK/b001/

go get 常用标记的使用

  • -d:只执行下载动作
  • -fix:在下载代码包后先执行修正动作,而后再进行编译和安装(例:1.0语法1.4不兼容,执行-fix会自动修正)
  • -u:利用网络来更新已有的代码包及其依赖包

扩展

http://hyper0x.github.io/go_command_tutorial/#/0.0


  1. -p 为指定目录路径