Hello-Go

ops/2024/11/22 14:11:25/

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 盘的用户目录下面

image-20241120104617089

​ 在一个集中的目录下,设置 GOROOT 的安装目录,然后将 GO 下载到这里,下载完之后还是建议为 GOROOT 的 bin 目录配置环境变量,这样你就可以在 IDE 的终端或者CMD窗口来使用 go 的一些工具链命令了

image-20241120104910764

​ 将这个路径配置到你的环境变量里面

image-20241120105040930

​ 配置完之后,你就可以在 cmd 和 终端,来使用go的一些命令了

image-20241120105140561

​ 如果你出现,类似

go : 无法将“go”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1 + go + ~~ + CategoryInfo : ObjectNotFound: (go:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException

​ 这样的报错,那添加一下环境变量就可以解决这个问题。

​ 当然了,其实现在的 IDE 是完全可以自动帮我们解决这部分的问题的,比如我用的 Goland 你完全可以在设置里面去自动解决,但是作为开发者,一些必要的最基础的原理还是明白的比较好

image-20241120105422539

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。

image-20241120110811187

​ 如果你不想特殊设置,默认情况下会选择 GOROOT 同级目录下,新建文件夹设置为 GOPATH ,下面是一些个人开发者或者企业开发的常用的架构

img

img

img

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 的参数,并将指定环境变量的默认设置更改为给定值。

image-20241120145108946

一些通用环境变量:

  • 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 模块代理

  1. GOPROXY.cn
    • 地址: https://goproxy.cn
    • 这是由七牛云提供的免费的 Go 模块代理服务,速度快且稳定。
  2. goproxy.io
    • 地址: https://goproxy.io
    • 这是一个由业界开发者提供的 Go 模块代理服务,主要面向全球用户,但在中国大陆也有不错的速度。
  3. 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

image-20241120114604473

image-20241120114621946

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 buildgo 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-repogo 1.13require (example.com/apple v0.1.2example.com/banana v1.2.3example.com/banana/v2 v2.3.4example.com/pear // indirectexample.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引入

image-20241120153229350

(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.0v0.2.0
)

​ 重新发布新版本后,在引用该依赖库的使用执行 go list 可以看到 版本和 “严重bug…” 的提醒;

​ 该特性的主要目的是将问题更直观的反馈到开发者的手中;

go.sum文件

​ 在第一次拉取模块依赖后(在 go mod init 阶段创建),会发现多出了一个 go.sum 文件,go.sum 主要是记录了所有依赖的 module 的校验信息,其详细罗列了当前项目直接或间接依赖的所有模块版本,并写明了那些模块版本的 SHA-256 哈希值以备 Go 在今后的操作中保证项目所依赖的那些模块版本不会被篡改。

image-20241120163623000

从上面我们可以看到主要是有两种形式:

  • 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:

  1. 拉取的依赖包没有发布 tags

    • 默认取主分支最近一次的 commit 的 commit hash,生成一个伪版本号
  2. 拉取的依赖包有发布tags

    • 如果只有单个模块,那么就取主版本号最大的那个tag

    • 如果有多个模块,则推算相应的模块路径,取主版本号最大的那个tag

没有发布的tags:

github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751

v0.0.0:根据commit的base version生成的:

image-20241120170856675

  • 如果没有base version,那么就是vx.0.0的形式

  • 如果base version是一个预发版本,那么就是vx.y.z-pre.0的形式

    image-20241120170911088

  • 如果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.0github.com/eddycjy/mquote
v1.0.0github.com/eddycjy/mquote
v2.0.0github.com/eddycjy/mquote/v2
v3.0.0github.com/eddycjy/mquote/v3
  1. 导入路径中忽略 v1 版本的原因是:考虑到许多开发人员创建一旦到达 v1 版本便永不改变的软件包,这是官方所鼓励的,不认为所有这些开发人员在无意发布 v2 版时都应被迫拥有明确的 v1 版本尾缀,这将导致 v1 版本变成“噪音”且无意义。
  2. 导入路径中忽略了 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 scriptsinit        initialize workspace filesync        sync workspace build list to modulesuse         add modules to workspace fileUse "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.18use (./mod ./tools
)

新的 go.work 与 go.mod 语法一致,也可以使用 replace 语法:

go 1.18use (...)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
    

gofmtgoimports 工具

gofmt 是一个格式化工具,而 goimports 不仅格式化代码,还会自动添加或移除 import 声明。

  • 安装 goimports

    go install golang.org/x/tools/cmd/goimports@latest
    
  • 运行 goimports

    goimports -w .
    

参考博客:

Go Modules 终极入门

史上最全的Go语言模块(Module)管理详解(基于Go1.19)

整理长博客真是一件费心费力的事情,学习一门编程语言我觉得不止止只是学会他的语法,了解语言本身的运行机制,无论是对于项目的开发还是解决一些 bug 的都是有用的,虽然今天整理的这部分内容,很多一些智能的IDE都可以自主完成,但我觉得技术不应该仅仅停留在会使用就行的地步,了解技术本身的实现原理才能在使用的基础上有自己的思考,才能形成自己的知识框架,我觉得这是科班出身和培训班速成应该有的区别。最近的事情有点繁多,论文项目作业很多很多事情,难得抽出时间来能专心学习整理一些技术,今天就这样吧,明天继续努力!


http://www.ppmy.cn/ops/135803.html

相关文章

【大选】2024年美国总统选举数据分析可视化

前言 • &#x1f453; 可视化主要使用 Plotly • &#x1f50e; 数据处理主要使用 pandas • &#x1f449; 本文是我自己在和鲸社区的原创 1.项目背景描述 2024年美国大选是该国政治生活中的重要事件&#xff0c;吸引了全球的关注。本报告通过对选举数据的分析&#xff0c…

Linux-Apache静态资源

文章目录 静态资源权限设置 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月20日11点21分 静态资源 Apache配置静态资源 可以在网页上配置一个静态的FTP服务器&#xff0c;让用户…

hadoop+wsl 10.255.255.254,BlockMissingException: Could not obtain block: 踩坑

起因&#xff1a; 我在我的wsl中启动一个hadoop 用java客户端连接hadoop&#xff0c;读取某个文件的内容异常&#xff0c;但是读取文件名&#xff0c;文件列表正常 问题&#xff1a; BlockMissingException: Could not obtain block:BP-xxx 显示缺少文件块&#xff0c;因此…

我用豆包MarsCode IDE 做了一个 CSS 权重小组件

作者&#xff1a;夕水 查看效果 作为一个前端开发者&#xff0c;应该基本都会用 VSCode 来做开发&#xff0c;所以也应该见过如下这张图的效果: 以上悬浮面板分为2个部分展示内容。 <element class"hljs-attr">: 代表元素只有一个类名叫hljs-attr的类选择器&am…

使用 npm 安装 Electron 作为开发依赖

好的&#xff0c;下面是一个使用 npm pack 和 npm install 命令来打包和安装离线版本的 npm 包的具体示例。我们将以 electron 为例&#xff0c;演示如何在有网络连接的机器上打包 electron&#xff0c;然后在没有网络连接的机器上安装它。 步骤 1: 在有网络连接的机器上打包 …

计算机网络(第一章)

文章目录 概述1.1计算机网络在信息时代的作用1.2因特网概述1. 网络,互连网(互联网)和因特网2. 因特网发展的三个阶段3.因特网的标准化工作4.因特网的组成 1.3 三种交换方式电路交换 (Circuit Switching)分组交换 (Packet Switching)报文交换 (Message Switching)三个交换的对比…

js制作文字走马灯

走马灯是一种常见的网页效果&#xff0c;可以用来展示图片或文字的循环滚动。 1. 关于HTML结构 添加可视区域用户可见部分&#xff0c;给走马灯文字内容制作了个盒子来存放他 <div class"notice"><img src"./img/7.jpg" alt"通知图标&quo…

【Element Ui】el-checkbox 的 indeterminate 与 v-model 表示 “全选”、“待选”、“不选” 状态

官网链接&#xff1a; https://element-plus.org/zh-CN/component/checkbox.html indeterminate 与 v-model indeterminate 属性用以表示 checkbox 的不确定状态&#xff0c;一般用于实现全选的效果。v-model 是绑定值indeterminate 与 v-model 对应不同值的组合可以改变 che…