入门03_工具链

工具链入门了解

go常用命令行

go version && go env && go list
go fmt build test clean install
go run

工具链

go build命令(编译命令)

go build会忽略目录下以”_”或者”.”开头的go文件。
go build时会选择性地编译以系统名结尾的文件(Linux、Darwin、Windows、Freebsd)。
-v 标记,可以把命令执行过程中构建的包名(包含编译过程中依赖的包)打印出来
-x 标记,可以打印编译期间所用到的所有shell命令。
-o 标记,用来指定生成文件的路径和名称。
-a 标记,强制重新编译。

Go语言基础go build命令用法及示例详解:https://www.jb51.net/article/229494.htm

go clean——清除编译文件

go clean命令用来移除当前源码包里面编译生成的文件

go fmt——格式化代码文件

gofmt -w src,可以格式化整个项目。

Go语言基础go fmt命令使用示例详解:https://www.jb51.net/article/229495.htm

go get——一键获取代码、编译并安装

go get 命令本质上是首先通过源码工具clone代码到src目录,然后执行go install。

go install——编译并安装

go install命令在内部分成两步操作:第一步是生成结果文件(可执行文件或者.a包),第二步会把编译好的结果移到 GOPATH/pkg 或者GOPATH/pkg或者GOPATH/bin。

Go语言基础go install命令使用示例详解:https://www.jb51.net/article/229490.htm

go mod

go版本为1.13及以上
开启 go mod :go env -w GO111MODULE=”on”
三个可选值:off、on、auto,默认值是auto。

1
2
3
GO111MODULE=off禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。
GO111MODULE=on启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。
GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,自动开启模块支持。

在项目管理中,如使用git,请将 vendor 文件夹放入白名单,不然项目中带上包体积会很大

1
2
3
4
5
6
7
go mod init:初始化go mod, 生成go.mod文件,后可接参数指定 module 名,上面已经演示过。
go mod download:手动触发下载依赖包到本地cache(默认为$GOPATH/pkg/mod目录)
go mod graph: 打印项目的模块依赖结构
go mod tidy :添加缺少的包,且删除无用的包
go mod verify :校验模块是否被篡改过
go mod why: 查看为什么需要依赖
go mod vendor :导出项目所有依赖到vendor下

如何给项目添加依赖(写进 go.mod)呢?
有两种方法:
你只要在项目中有 import,然后 go build 就会 go module 就会自动下载并添加。
自己手工使用 go get 下载安装后,会自动写入 go.mod 。

go fix

go fix用来修复老版本的代码到新版本,例如go1前老版本的代码转化到go1。

go version

go version命令用于查看go当前的版本。

go env

go env命令用于查看当前go的环境变量,用于打印GO语言的环境信息,如GOPATH是工作区目录,GOROOT是GO语言安装目录,GOBIN是通过go install命令生成可执行文件的存放目录(默认是当前工作区的bin目录下),GOEXE为生成可执行文件的后缀。

go list

go list命令用于列出当前全部安装的package。

go run——编译并运行

go run命令用于编译并运行Go程序,只能作用于命令源码文件,一般用于开发中快速测试。

go tool

go tool命令工具,go tool pprof性能检查工具,? ?go tool cgo跟C语言和GO语言有关的命令。

go vet

go vet是静态检查工具,用于一般项目快完成时进行进行优化。

go bug

go bug命令用于GO语言调试。

go generate——在编译前自动化生成某类代码

通过扫描Go源码中的特殊注释来识别要运行的常规命令。go generate不是go build的一部分,go generate不包含依赖关系分析,必须在运行go build前显式运行。go generate由Go package的作者使用,而不是其客户端。

go doc

Go语言基础go doc命令用法及示例详解:https://www.jb51.net/article/229499.htm

go test命令(Go语言测试命令)

go pprof命令(Go语言性能分析命令)

Go的强大之处是它已经在语言层面集成了profile采样工具,允许程序在运行时使用它们

go-torch

go-torch是Uber公司开源的一款针对Golang程序的火焰图生成工具,能收集 stack traces,并把它们整理成火焰图,直观地程序给开发人员。go-torch是基于使用BrendanGregg创建的火焰图工具生成直观的图像,很方便地分析Go的各个方法所占用的CPU的时间。

goreplay

gorepaly是一个开源工具,抓取生产环境流量,并使用真实流量持续测试系统。它使用raw-socket抓取系统流量,并根据指定的url,将流量进行转发。

golint

golint工具是对代码质量的检查,会给出一些最佳实践指引。

go run、go build 和 go get

go run
go run,简单理解就像是解释的方式来执行代码,而在细节上它其实会将代码进行编译,最后产生可执行文件,然后运行该可执行文件,产生程序执行后的结果,而可执行文件会放在特定的临时文件里面,执行完就会自动删除了。 通常开发上就是用于假设只是要测试一段代码,那就会用go run来执行。

go build
go build 仅仅编译以导入路径命名的包及其依赖项,将其放到本地。通常在 $GOPATH 目录下执行 go build,Go 会自动去src下寻找对应项目目录,默认是在当前目录下生成可执行文件。
go build 缺点:每次编译代码,比较没有效率,当项目架构越来越大,build的速度也就越来越慢。

go install
因为 go build的缺点,因此有 go install 指令,go install 可以做两件事情:
将包编译成.a 中间缓存对象,如果源码尚未更改,将在下一次编译期间使用缓存。
如果是main包,并将其编译成可执行文件

1
2
3
4
5
6
├── bin
│ └── hello # by go install
└── src
└── hello
├── hello # by go build
└── hello.go

注意:
go install 如果要在非GOPATH路径下使用的话,要先设定GOBIN环境变量,否则会出现错误
通常GOBIN环境变量就是设定GOPATH/bin。

go build和go install

我觉得可能跟依赖包的管理方式有关吧 不用go module(或go dep),依赖包要自己用go get下载到本地,而go mod会是把依赖包下载到临时文件夹(pkg/mod),go dep是下载到当前文件夹的vendor,用go install -i 的时候,这些依赖包的源代码并不真正存在go path的src下,所以没法在pkg生成和src相同的目录结构,所以也就不能在pkg的相同目录下生成a了(生成的a估计也是在临时文件夹里)
好像临时文件夹里也没有,我全盘扫过了没有对应的.a文件。这么看好像install这个命令已经没用处了呀,就是比build多了一个吧exe扔到bin里的操作。 而且好像只能用build去生成.a。install好像没办法生成了。 难道是因为.a只是一个中间结果的缘故就被废弃了?不是说go在编译的时候先判断package的源码是否有改动,如果没有的话,就不再重新编译.a,删了.a不会使速度下降嘛。而且我好像看到资料有些地方的开发需要用.a当库文件吧。

参考

Golang工具链:https://studygolang.com/articles/18656?fr=sidebar
go module 基本使用:https://www.cnblogs.com/chnmig/p/11806609.html
一文搞懂 Go Modules 前世今生及入门使用:https://www.cnblogs.com/wongbingming/p/12941021.html
GOROOT、GOPATH 以及 Go 相关命令:https://www.cnblogs.com/vio1etus/p/gorootgopath-he-gomodules.html
【小白】在使用了Go module之后,go build和go install 的区别是什么呢?怎么不加参数好像都不会生成.a文件了:https://bbs.csdn.net/topics/396525123
Go语言开发(一)、Go语言简介:https://blog.51cto.com/u_9291927/2126775

go入门系列
入门02_IDE安装
入门03_工具链
入门04_入门demo和基本类型
入门05_go升级版本
入门06_教程biancheng
入门08_教程编程时光
入门09_Go语言高级编程
入门10_包导入
入门11_方法接口和嵌入类型
入门12_数组和切片

#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×