Hello-Go
Hello-Go
环境变量
GOPATH 和 GOROOT :不同于其他语言,go中没有项目的说法,只有包,其中有两个重要的路径,GOROOT 和 GOPATH
Go开发相关的环境变量如下:
- GOROOT:GOROOT就是Go的安装目录,(类似于java的JDK)
- GOPATH:GOPATH是我们的工作空间,保存go项目代码和第三方依赖包
- GOPATH可以设置多个,其中,第一个将会是默认的包目录,使用 go get 下载的包都会在第一个path中的src目录下,使用 go install时,在哪个 GOPATH 中找到了这个包,就会在哪个 GOPATH下 的bin目录生成可执行文件
Go 语言依赖几个关键的环境变量来管理开发环境、编译器、工具链和包管理。这些环境变量帮助开发者配置和运行 Go 项目。下面是一些主要的环境变量:
GOROOT
GOROOT 是 Go 安装目录的路径。这个变量指向 Go 工具链和标准库所在的位置。通常在安装 Go 时,GOROOT 会被自动设置,不需要手动配置。但是,作为一个优秀的开发者,我们还是需要了解这部分的内容
无论你使用什么 IDE 来编写 GO 语言代码,Goland,IDEA 或者 Vscode ,都需要下载配置 Go 的安装目录(类似于 java 的 JDK);一般建议,JDK 或者 SDK 相关的文件可以放在 C 盘的用户目录下面
在一个集中的目录下,设置 GOROOT 的安装目录,然后将 GO 下载到这里,下载完之后还是建议为 GOROOT 的 bin 目录配置环境变量,这样你就可以在 IDE 的终端或者CMD窗口来使用 go 的一些工具链命令了
将这个路径配置到你的环境变量里面
配置完之后,你就可以在 cmd 和 终端,来使用go的一些命令了
如果你出现,类似
go : 无法将“go”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1 + go + ~~ + CategoryInfo : ObjectNotFound: (go:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
这样的报错,那添加一下环境变量就可以解决这个问题。
当然了,其实现在的 IDE 是完全可以自动帮我们解决这部分的问题的,比如我用的 Goland 你完全可以在设置里面去自动解决,但是作为开发者,一些必要的最基础的原理还是明白的比较好
GOPATH
GOPATH 是工作空间的路径,用于存放 Go 源代码、包和可执行文件。GOPATH 工作空间包含三个目录:src(源代码 .go .c .h .s等)、pkg(编译后的包 .a)和 bin(编译后的可执行文件,如果你想终端启动,也可以把这部分设置为环境变量)。
GOPATH 是 开发时的工作目录。用于:
- 保存编译后的二进制文件。
- go get 和 go install命令会下载 go 代码到GOPATH。
- import 包时的搜索路径
使用 GOPATH 时,GO会在以下目录中搜索包:
GOROOT/src:该目录保存了Go 标准库代码。
GOPATH/src:该目录保存了应用自身的代码和第三方依赖的代码。
当然现在主流已经有 mod 来管理包了,GOPATH 已经是过去时的用法了
一般来说,GOPATH 类似 GOROOT 放在一个文件里面就可以了,但是不同的是,如果我们开发不同的项目,一直在一个文件里面不断地添加东西毕竟不太合适,这部分 Goland 提供了一个很好的功能,我们可以设置全局的也可以设置项目局部的 GOPATH
图中的 Global GOPATH 代表全局 GOPATH,一般来源于系统环境变量中的 GOPATH;Project GOPATH 代表项目所使用的 GOPATH,该设置会被保存在工作目录的 .idea 目录下,不会被设置到环境变量的 GOPATH 中,但会在编译时使用到这个目录。
建议在开发时只填写项目 GOPATH,每一个项目尽量只设置一个 GOPATH,不使用多个 GOPATH 和全局的 GOPATH。
如果你不想特殊设置,默认情况下会选择 GOROOT 同级目录下,新建文件夹设置为 GOPATH ,下面是一些个人开发者或者企业开发的常用的架构
GOBIN
GOBIN 是安装 Go 可执行文件的目录。默认情况下,它是 $GOPATH/bin,但可以自定义为其他路径。
GOARCH
$GOARCH 表示目标机器(目标机器是指你打算运行你的 Go 应用程序的机器。)的处理器架构,它的值可以是 386、amd64 或 arm。
GOOS
$GOOS 表示目标机器的操作系统,它的值可以是 darwin、freebsd、linux 或 windows。
- $GOARM 专门针对基于 arm 架构的处理器,它的值可以是 5 或 6,默认为 6。
- $GOMAXPROCS 用于设置应用程序可使用的处理器个数与核数
查看工具 go env
列出 go 环境变量
go env
go env 常用的参数说明:
- -json:以 json 格式打印环境变量。
- -u:后面需要跟上一个或多个参数值,如果使用’go env -w’设置了指定环境变量的值,则取消对应的值设置。
- -w:后面需要跟上一个或多个形式为 NAME=VALUE 的参数,并将指定环境变量的默认设置更改为给定值。
一些通用环境变量:
-
GO111MODULE:用来控制使用 go mod 模式还是 GOPATH 模式,值为 off, on 或 auto。
-
GCCGO:gccgo 命令运行’go build -compiler=gccgo’。
-
GOARCH:当前架构,例如 amd64, 386, arm, ppc64等。
-
GOBIN:Go 命令的默认二进制目录,即’go install’将安装命令的目录。
-
GOCACHE:Go 命令的缓存目录。
-
GOMODCACHE:go命令将存储下载模块的目录。
-
GODEBUG:启用各种调试工具,参见’go doc runtime’。
-
GOENV:Go 环境变量配置文件的位置。
-
GOFLAGS:Go 命令的标志位参数。
-
GOINSECURE:用于指定哪些域名下的仓库不校验CA证书。
-
GOOS:当前操作系统,例如 linux,darwin,windows,netbsd 等。
-
GOPATH:Go 项目的根目录。
-
GOPROXY:Go module 代理的 URL。
-
GOROOT:Golang 安装的根目录。
-
GOSUMDB:要使用的校验数据库的名称以及可选的公钥和URL
-
GOTMPDIR:go 命令写入的目录,临时的源文件、包和二进制文件。
-
GOVCS:列出可能与匹配服务器一起使用的版本控制命令。
-
GOWORK:workspace 设置。
Go Modules
go modules是 golang 1.11引入的新特性。模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
GO111MODULE
GO111MODULE有三个值:off、on 和 auto(默认值)
-
GO111MODULE=off,无模块支持,使用传统的 GOPATH 模式,go 会从 GOPATH 和 vendor 文件夹寻找包
-
GO111MODULE=on,启用模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖
-
GO111MODULE=auto,在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持
在使用模块的时候,GOPATH 是无意义的,不过它还是会把下载的依赖储存在 $GOPATH/pkg 中,
也会把 go install 的结果放在 $GOPATH/bin 中。
允许同一个package多个版本并存,且多个项目可以共享缓存的 module
GOPROXY —— 代理加速
GOPROXY
是 Go 语言中用于配置模块代理的环境变量。模块代理可以缓存和加速 Go 模块的下载,尤其对于中国大陆的用户,由于网络环境的限制,访问官方的 proxy.golang.org
可能会遇到较慢的下载速度。使用国内的 Go 模块代理可以显著提高下载和构建速度
常用的国内 Go 模块代理
- GOPROXY.cn
- 地址:
https://goproxy.cn
- 这是由七牛云提供的免费的 Go 模块代理服务,速度快且稳定。
- 地址:
- goproxy.io
- 地址:
https://goproxy.io
- 这是一个由业界开发者提供的 Go 模块代理服务,主要面向全球用户,但在中国大陆也有不错的速度。
- 地址:
- Aliyun Go 镜像
- 地址:
https://mirrors.aliyun.com/goproxy/
- 这是由阿里云提供的 Go 模块代理服务,适合在中国大陆使用。
- 地址:
配置 GOPROXY
go env -w GOPROXY=https://goproxy.cn,direct
设置多个代理
GOPROXY
支持配置多个代理服务器,以逗号分隔。如果第一个代理不可用,Go 工具链将自动尝试下一个。例如:
go env -w GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct
这将会首先尝试 goproxy.cn
,如果失败,则尝试 proxy.golang.org
,最后直接从源代码库获取模块。
验证配置
可以在 IDE 设置里面或者终端使用命令查看
go env GOPROXY
Go mod
Golang 1.11 版本引入的 go mod ,其思想类似 maven:摒弃 vendor 和GOPATH,拥抱本地库。从 Go 1.11 开始,Go 允许在 $GOPATH/src 外的任何目录下使用 go.mod 创建项目。
在$GOPATH/src 中,为了兼容性,Go 命令仍然在旧的 GOPATH 模式下运行。从 Go 1.13 开始,Module 模式将成为默认模式。
命令 | 作用 |
---|---|
go mod init | 生成 go.mod 文件 |
go mod download | 下载 go.mod 文件中指明的所有依赖 |
go mod tidy | 整理现有的依赖 |
go mod graph | 查看现有的依赖结构 |
go mod edit | 编辑 go.mod 文件 |
go mod vendor | 导出项目所有的依赖到vendor目录 |
go mod verify | 校验一个模块是否被篡改过 |
go mod why | 查看为什么需要依赖某模块 |
go mod
命令详解
初始化和创建模块
go mod init <module-path>
:初始化一个新的模块,并创建一个go.mod
文件。<module-path>
是模块的路径,通常是项目的仓库地址。
go mod init github.com/user/project
管理依赖
go get <package>
:添加或更新一个依赖包。可以指定特定版本,如@v1.2.3
。
go get github.com/sirupsen/logrus@v1.8.1
go tidy
:清理模块依赖。移除go.mod
文件中未使用的依赖,并下载缺失的依赖。
go mod tidy
go vendor
:将依赖包复制到vendor
目录。可以使用go build
和go test
时从vendor
目录中读取依赖。
go mod vendor
查看依赖
go list -m all
:列出所有的模块依赖。
go list -m all
go mod graph
:打印模块依赖图。
go mod graph
go mod why <package>
:解释为什么需要某个依赖包。
go mod why github.com/sirupsen/logrus
版本管理
go mod edit
:手动编辑go.mod
文件的工具,可以修改模块路径、版本等。
go mod edit -require=github.com/sirupsen/logrus@v1.8.1
升级和降级依赖
go get -u
:升级所有依赖包到最新版本。
go get -u
go get <package>@latest
:升级指定包到最新版本。
go get github.com/sirupsen/logrus@latest
go get <package>@<version>
:将指定包降级或升级到特定版本。
go get github.com/sirupsen/logrus@v1.7.0
go.mod文件
module github.com/eddycjy/module-repo
go 1.13
require (
example.com/apple v0.1.2
example.com/banana v1.2.3
example.com/banana/v2 v2.3.4
example.com/pear // indirect
example.com/strawberry // incompatible
)
exclude example.com/banana v1.2.4
replace example.com/apple v0.1.2 => example.com/fried v0.1.0
replace example.com/banana => example.com/fish
go.mod是启用Go modules的项目所必须且最重要的文件,其描述了当前项目的元信息,每个go.mod文件开头符合包含如下信息:
-
module:用于定义当前项目的模块路径(突破$GOPATH路径)
-
go:当前项目 Go 版本,目前只是标识作用
-
require:用设置一个特定的模块版本
-
exclude:用于从使用中排除一个特定的模块版本
-
replace:用于将一个模块版本替换为另外一个模块版本,例如chromedp使用golang.org/x/image这个package一般直连是获取不了的,但是它有一个github.com/golang/image的镜像,所以我们要用replace来用镜像替换它
-
restract:用来声明该第三方模块的某些发行版本不能被其他模块使用,在Go1.16引入
(1)module path
go.mod 文件的第一行是 module path,采用 仓库+module name 的方式定义;
module github.com/asong2020/go-localcache
因为Go module遵循语义化版本规范2.0.0,所以如果工程的版本已经大于2.0.0,按照规范需要加上 major 的后缀,module path 改成如下:
module github.com/asong2020/go-localcache/v2
module github.com/asong2020/go-localcache/v3
(2)go version
go.mod文件的第二行是go version,其是用来指定你的代码所需要的最低版本:
go 1.17
其实这一行不是必须的,目前也只是标识作用,可以不写;
(3)require
require 用来指定该项目所需要的各个依赖库以及他们的版本,
indirect注释
github.com/davecgh/go-spew v1.1.0 // indirect
indirect 标识表示该模块为间接依赖,也就是在当前应用程序中的 import 语句中,并没有发现这个模块的明确引用,有可能是先手动 go get
拉取下来的,也有可能是所依赖的模块所依赖的
以下场景才会添加indirect注释:
-
当前项目依赖包A,但是A依赖包B,但是A的go.mod文件中缺失B,所以在当前项目go.mod中补充B并添加indirect注释
-
当前项目依赖包A,但是依赖包A没有 go.mod 文件,所以在当前项目 go.mod 中补充 B并添加 indirect 注释
-
当前项目依赖包A,依赖包A又依赖包B,当依赖包A降级不在依赖B时,这个时候就会标记 indirect 注释,可以执行 go mod tidy 移除该依赖;
Go1.17版本对此做了优化,indirect 的 module 将被放在单独 require 块的,这样看起来更加清晰明了。
incompatible标记
github.com/dgrijalva/jwt-go v3.2.0+incompatible
jwt-go 这个库就是这样的,这是因为jwt-go的版本已经大于2了,但是他们的module path仍然没有添加v2、v3这样的后缀,不符合Go的module管理规范,所以go module把他们标记为incompatible,不影响引用;
(4)replace
replace 用于解决一些错误的依赖库的引用或者调试依赖库;
举例1:
日常开发离不开第三方库,大部分场景都可以满足我们的需要,但是有些时候我们需要对依赖库做一些定制修改,依赖库修改后,我们想引起最小的改动,就可以使用 replace 命令进行重新引用,调试也可以使用 replace 进行替换,Go1.18 引入了工作区的概念,调试可以使用 work 进行代替
举例2:
golang.org/x/crypto库一般我们下载不下来,可以使用replace引用到github.com/golang/crypto:
go mod edit -replace golang.org/x/crypto=github.com/golang/crypto@v0.0.0-20160511215533-1f3b11f56072
(5)exclude
用于跳过某个依赖库的版本,使用场景一般是我们知道某个版本有bug或者不兼容,为了安全起可以使用exclude跳过此版本;
exclude (
go.etcd.io/etcd/client/v2 v2.305.0-rc.0
)
(6)retract
这个特性是在 Go1.16 版本中引入,用来声明该第三方模块的某些发行版本不能被其他模块使用;
使用场景:发生严重问题或者无意发布某些版本后,模块的维护者可以撤回该版本,支持撤回单个或多个版本;
这种场景之前的解决办法:
-
维护者删除有问题版本的 tag,重新打一个新版本的 tag;
-
使用者发现有问题的版本 tag 丢失,手动介入升级,并且不明真因;
引入retract后,维护者可以使用 retract 在 go.mod 中添加有问题的版本:
// 严重bug...
retract (
v0.1.0
v0.2.0
)
重新发布新版本后,在引用该依赖库的使用执行 go list 可以看到 版本和 “严重bug…” 的提醒;
该特性的主要目的是将问题更直观的反馈到开发者的手中;
go.sum文件
在第一次拉取模块依赖后(在 go mod init 阶段创建),会发现多出了一个 go.sum 文件,go.sum 主要是记录了所有依赖的 module 的校验信息,其详细罗列了当前项目直接或间接依赖的所有模块版本,并写明了那些模块版本的 SHA-256 哈希值以备 Go 在今后的操作中保证项目所依赖的那些模块版本不会被篡改。
从上面我们可以看到主要是有两种形式:
-
h1:
-
/go.mod h1:
其中 module 是依赖的路径,version是依赖的版本号。hash 是以 h1: 开头的字符串,h1 hash 是 Go modules 将目标模块版本的 zip 文件开包后,针对所有包内文件依次进行 hash,然后再把它们的 hash 结果按照固定格式和算法组成总的 hash 值。
h1 hash 和 go.mod hash 两者要不同时存在,要不就是只存在 go.mod hash,当Go认为肯定用不到某个版本的时候就会省略它的h1 hash,就只有go.mod hash;
Go get
在拉取项目依赖时,你会发现拉取的过程总共分为了三大步,分别是 finding(发现)、downloading(下载)以及 extracting(提取), 并且在拉取信息上一共分为了三段内容:
常用的拉取命令如下:
命令 | 作用 |
---|---|
go get | 拉取依赖,会进行指定性拉取(更新),并不会更新所依赖的其它模块。 |
go get -u | 更新现有的依赖,会强制更新它所依赖的其它全部模块,不包括自身。 |
go get -u -t ./… | 更新所有直接依赖和间接依赖的模块版本,包括单元测试中用到的。 |
选择具体版本,如下:
命令 | 作用 |
---|---|
go get golang.org/x/text@latest | 拉取最新的版本,若存在tag,则优先使用。 |
go get golang.org/x/text@master | 拉取 master 分支的最新 commit。 |
go get golang.org/x/text@v0.3.2 | 拉取 tag 为 v0.3.2 的 commit。 |
go get golang.org/x/text@342b2e | 拉取 hash 为 342b231 的 commit,最终会被转换为 v0.3.2。 |
版本选择
go get
没有指定任何版本的情况下,它的版本选择规则是怎么样的
go get 拉取依赖包取决于依赖包是否有发布的 tags:
-
拉取的依赖包没有发布 tags
- 默认取主分支最近一次的 commit 的 commit hash,生成一个伪版本号
-
拉取的依赖包有发布tags
-
如果只有单个模块,那么就取主版本号最大的那个tag
-
如果有多个模块,则推算相应的模块路径,取主版本号最大的那个tag
-
没有发布的tags:
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
v0.0.0:根据commit的base version生成的:
-
如果没有base version,那么就是vx.0.0的形式
-
如果base version是一个预发版本,那么就是vx.y.z-pre.0的形式
-
如果base version是一个正式发布的版本,那么它就patch号加1,就是vx.y.(z+1)-0的形式
20190718012654:是这次提交的时间,格式是yyyyMMddhhmmss
fb15b899a751:是这个版本的commit id,通过这个可以确定这个库的特定的版本
github.com/beego/bee v1.12.0
PS :
实际上 Go modules 在主版本号为 v0 和 v1 的情况下省略了版本号,而在主版本号为v2及以上则需要明确指定出主版本号,否则会出现冲突;主版本号为 v0 和 v1 时,不需要在模块导入路径包含主版本的信息,而在 v1 版本以后,也就是 v2 起,必须要在模块的导入路径末尾加上主版本
忽略主版本号 v0 和 v1 是强制性的(不是可选项)
tag | 模块导入路径 |
---|---|
v0.0.0 | github.com/eddycjy/mquote |
v1.0.0 | github.com/eddycjy/mquote |
v2.0.0 | github.com/eddycjy/mquote/v2 |
v3.0.0 | github.com/eddycjy/mquote/v3 |
- 导入路径中忽略 v1 版本的原因是:考虑到许多开发人员创建一旦到达 v1 版本便永不改变的软件包,这是官方所鼓励的,不认为所有这些开发人员在无意发布 v2 版时都应被迫拥有明确的 v1 版本尾缀,这将导致 v1 版本变成“噪音”且无意义。
- 导入路径中忽略了 v0 版本的原因是:根据语义化版本规范,v0的这些版本完全没有兼容性保证。需要一个显式的 v0 版本的标识对确保兼容性没有多大帮助。
Go work
工作区
工作区用来解决什么问题?
场景1:像是平时在 Go 工程中,我们为了解决一些本地依赖,或是定制化代码(对一些三方依赖库进行特制修改)然后想在项目修改依赖库引用到本地进行调试。会在 go.mod 文件中使用 replace 做替换。这样就可以实现本地开发联调时的准确性。
如下代码:
replace golang.org/x/net => /Users/eddycjy/go/awesomeProject
问题就在这里:
- 本地路径:所设定的 replace 本质上转换的是本地的路径,也就是每个人都不一样。
- 仓库依赖:文件修改是会上传到 Git 仓库的,不小心传上去了,影响到其他开发同学,又或是每次上传都得重新改回去。
场景2:我们在本地开发了一些依赖库,这时想在本地测试一下,还未发到远程仓库,那么我们在其他项目中引入该依赖库后,执行go mod tidy
就会报远程库没有找到的问题,所以就必须要把依赖库先推送到远程,在引用调试;
正是这些问题,Go语言在Go1.18正式增加了go work
工作区的概念,其能够在本地项目的 go.work 文件中,通过设置一系列依赖的模块本地路径,再将路径下的模块组成一个当前 Go 工程的工作区,也就是 N 个 Go Module 组成 1 个 Go Work, 工作区的读取优先级是最高的,执行go help work
可以查看 go work 提供的功能:
$ go help work
Usage:
go work <command> [arguments]
The commands are:
edit edit go.work from tools or scripts
init initialize workspace file
sync sync workspace build list to modules
use add modules to workspace file
Use "go help work <command>" for more information about a command.
执行go work init
命令初始化一个新的工作区,在项目中生成一个 go.work 文件:
命令如下:
go work init ./mod ./tools
项目目录如下:
awesomeProject
├── mod
│ ├── go.mod // 子模块
│ └── main.go
├── go.work // 工作区
└── tools
├── fish.go
└── go.mod // 子模块
生成的 go.work 文件内容:
go 1.18
use (
./mod
./tools
)
新的 go.work 与 go.mod 语法一致,也可以使用 replace 语法:
go 1.18
use (...)
replace golang.org/x/net => example.com/fork/net v1.4.5
go.work 文件与 go.mod文件语法一致,go.work 支持三个指令:
- go:声明 go 版本号
- use:声明应用所依赖模块的具体文件路径,路径可以是绝对路径或相对路径,即使路径是当前应用目录外也可
- replace:声明替换某个模块依赖的导入路径,优先级高于 go.mod 中的 replace 指令;
所以针对上述场景,我们使用go work init命令在项目中对本地依赖库进行关联即可解决,后续我们只需要在git配置文件中添加go.work文件不推送到远程即可;
我们也可以在编译时通过-workfile=off
指令禁用工作区模式:
go run -workfile=off main.go
go build -workfile=off
go.work 的推出主要是用于在本地调试,不会因为修改go.mod引入问题;
go.work 文件是不需要提交到 Git 仓库上的,否则就比较折腾了。
只要你在 Go 项目中设置了 go.work 文件,那么在运行和编译时就会进入到工作区模式,会优先以工作区的配置为最高优先级,来适配本地开发的诉求。
Go工具链
Go 语言提供了一组强大的工具,帮助开发者进行代码编写、构建、测试和部署。
go
命令
go
命令是 Go 工具链的核心,它提供了一系列子命令,用于管理 Go 项目和依赖。以下是一些常用的 go
子命令:
-
构建与运行
-
go build
:编译包和依赖,但不安装结果。可以用于测试编译。go build
-
go run
:编译并运行 Go 程序,适用于快速测试和开发阶段。go run main.go
-
-
测试
-
go test
:自动化测试工具,运行测试函数,并输出测试结果。go test ./...
-
-
安装
-
go install
:编译并安装包和依赖,将结果放在$GOPATH/bin
目录下。go install
-
-
依赖管理
-
go mod
:管理模块和依赖关系,详细介绍见上一节。go mod init go mod tidy
-
-
格式化和文档
-
go fmt
:格式化代码,确保代码风格一致。go fmt ./...
-
go doc
:显示包或符号的文档。go doc fmt.Println
-
godoc
工具
godoc
工具用于生成和浏览 Go 项目的文档。它可以启动一个本地的文档服务器,方便开发者查看代码的文档注释和 API 说明。
-
启动
godoc
服务器:godoc -http=:6060
然后可以在浏览器中访问
http://localhost:6060
查看文档。
go fmt
工具
go fmt
是一个代码格式化工具,它根据官方的代码风格指南自动格式化 Go 代码,保持代码的一致性和可读性。
-
格式化当前包的所有 Go 文件:
go fmt ./...
go vet
工具
go vet
是一个静态代码分析工具,用于发现代码中的潜在错误和问题。例如,它可以检测到未使用的变量、错误的格式化字符串等。
-
运行
go vet
:go vet ./...
golint
工具
golint
是一个代码风格检查工具,它检查代码是否符合 Go 的编码规范和最佳实践。需要先通过 go get
安装:
-
安装
golint
:go install golang.org/x/lint/golint@latest
-
运行
golint
:golint ./...
go tool pprof
工具
pprof
是一个性能分析工具,用于分析 Go 程序的 CPU 和内存使用情况。通过 go test
或程序运行时生成的性能数据,pprof
可以帮助开发者优化程序性能。
-
启动
pprof
:go tool pprof cpu.prof
dlv
工具
dlv
(Delve)是 Go 的调试工具,支持设置断点、查看变量、单步执行等功能。需要先安装 dlv
:
-
安装
dlv
:go install github.com/go-delve/delve/cmd/dlv@latest
-
使用
dlv
调试:dlv debug main.go
gofmt
和 goimports
工具
gofmt
是一个格式化工具,而 goimports
不仅格式化代码,还会自动添加或移除 import 声明。
-
安装
goimports
:go install golang.org/x/tools/cmd/goimports@latest
-
运行
goimports
:goimports -w .
参考博客:
Go Modules 终极入门
史上最全的Go语言模块(Module)管理详解(基于Go1.19)
整理长博客真是一件费心费力的事情,学习一门编程语言我觉得不止止只是学会他的语法,了解语言本身的运行机制,无论是对于项目的开发还是解决一些 bug 的都是有用的,虽然今天整理的这部分内容,很多一些智能的IDE都可以自主完成,但我觉得技术不应该仅仅停留在会使用就行的地步,了解技术本身的实现原理才能在使用的基础上有自己的思考,才能形成自己的知识框架,我觉得这是科班出身和培训班速成应该有的区别。最近的事情有点繁多,论文项目作业很多很多事情,难得抽出时间来能专心学习整理一些技术,今天就这样吧,明天继续努力!