终极攻略!go get命令使用教程

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 终极攻略!go get命令使用教程

1. go get 命令简介

go get 命令用于下载并安装 Go 语言包,它会自动解析导入路径,找到对应的代码库地址,利用 git/hg/svn 等版本控制工具将代码下载并安装到 GOPATH/src 目录。


import "github.com/gin-gonic/gin"

运行 go get github.com/gin-gonic/gin 会自动安装 gin 框架。

命令格式

go get [-d] [-t] [-u] [build flags] [packages]

常用参数说明:

-d:只下载,不安装

-t:同时下载需要为运行测试所需要的包

-u:更新本地已有的包到最新版本

[build flags]:编译参数,用于指定平台、版本等信息

[packages]:自动解析导入路径,安装指定的包

工作原理

go get 命令会自动解析导入路径,找到对应的 git/hg/svn 代码仓库地址,利用版本控制工具将代码下载到GOPATH/src 目录,然后进行自动编译安装。

以安装 gin 为例,会执行以下步骤:

github.com/gin-gonic/gin 转化为 github.com/gin-gonic/gin 代码仓库地址

使用 git 克隆 github.com/gin-gonic/gin 仓库到 GOPATH/src 目录

对下载的代码进行编译安装

将安装信息写入依赖管理文件 go.mod

所以使用 go get 前需要确保环境中已经安装好 git/hg/svn 等工具。


 

2. go get 命令详解

go get 命令功能强大,提供了丰富的功能来安装 Go 语言包。

2.1 下载最新版本代码

直接使用 go get 包路径 会下载最新的 master/trunk 分支代码


$ go get github.com/gin-gonic/gin

这就获取了 gin 框架最新的开发版本。

2.2 下载指定版本代码

使用 @版本号 可以下载指定版本代码


$ go get github.com/gin-gonic/gin@v1.8.1

这会下载 v1.8.1 版本的 gin。

也可以使用 commit id


$ go get github.com/gin-gonic/gin@e2212d88b18a

commit id 需要在仓库提交记录中查找。

2.3 更新已安装的包

对于已安装的包,使用 -u 参数可以将其更新到最新版本


$ go get -u github.com/gin-gonic/gin

这会将本地 gin 包更新到最新的 master/trunk 代码。

2.4 安装私有仓库的包

有时候会将代码仓库托管在私有 Gitlab/SVN 等仓库,这时直接使用导入路径是不行的,需要指定仓库地址


$ go get gitlab.com/orgname/reponame$ go get svn.internal.com/svn/proj/trunk

注意不同的版本控制工具使用的协议和地址格式有所差异。

2.5 将依赖下载到 vendor 目录

默认情况下, go get 只会下载目标包的代码,而不会下载其依赖。

使用 -v 参数可以在下载包的同时也下载其依赖:


$ go get -v github.com/gin-gonic/gin

这会将 gin 及其所有依赖也下载下来,存储在 vendor 目录中。

2.6 避免自动安装推荐的包

有些包代码中会通过注释的方式推荐用户安装其他相关包,使用 -d 参数可以避免这种自动安装


$ go get -d github.com/gin-gonic/gin

这就只下载 gin 包,而不会下载其推荐的其他包。


 

3. go get 命令的常见用法

go get 命令功能强大,在团队项目开发中有很多常见用法。

3.1 初始化新项目

利用 go get 可以一步初始化新项目


$ mkdir myapp$ cd myapp$ go mod init github.com/mouday/myapp$ go get github.com/gin-gonic/gin$ tree.├── go.mod└── src    └── github.com        └── mouday            └── myapp

这就创建了一个依赖 gin 的新项目。

3.2 安装依赖包

在代码中导入需要的包后,可通过 go get 安装依赖


import (    "github.com/gin-gonic/gin"    "github.com/go-sql-driver/mysql")
$ go get

这会自动解析导入路径,安装这两个依赖包。

3.3 更新依赖包

利用 -u 参数可以轻松更新所有依赖包


$ go get -u

这可以避免依赖包版本过旧带来的问题。

3.4 跨平台编译

指定平台参数,可以编译出适用于不同平台的执行文件


$ go get -v -ldflags "-s -w" \     github.com/go-sql-driver/mysql

常见的平台值包括: linux , windows , darwin 等。

3.5 指定代理镜像

有时候需要通过代理来下载依赖包


$ go env -w GOPROXY=https://goproxy.cn$ go get github.com/gin-gonic/gin

这会通过 goproxy.cn 代理镜像来下载 gin 包。


 

4. go get 遇到的问题及解决方法

在使用 go get 时也可能碰到一些问题,主要包括

4.1 网络代理及 VPN 导致的下载失败

有时候在公司网络环境下,由于代理或 VPN 的影响,会导致 go get 无法正常工作。

这时可以通过如下办法解决:


$ go env -w GOPROXY=https://goproxy.cn$ go env -w GOSUMDB=off

使用国内代理镜像,并关闭校验和数据库。

4.2 git 仓库访问失败

github 上的仓库访问会失败


package github.com/gin-gonic/gin: 
unrecognized import path "github.com/gin-gonic/gin"

这是因为无法访问到 git 仓库,需要确保网络畅通或者使用代理。

4.3 SSH keys 配置错误

访问私有 git 仓库有时候需要基于 SSH 协议和密钥认证


go get gitlab.company.com/pkg/tools# ERROR: repository access denied

这时需要确认 ~/.ssh 目录下有对应的私钥配置,并添加到 SSH agent 中。

4.4 vendor 目录冲突

若项目中已经存在 vendor 目录,再次 go get 时会提示冲突


go get: vendor/cache/download failed: rename [...]: file exists

需要先删除 vendor 目录,或者使用 -mod=readonly 参数来避免更新 vendor。


 

5. 总结

go get 命令在 Go 语言开发中非常重要,有效利用可以提高效率。

go get 工具简化了依赖管理,可以通过简单一条语句完成包的下载和安装。这对团队协作非常重要。

go get 需要依赖 go modules 来记录依赖关系,进行版本选择等。所以要充分结合使用。

Go 语言生态正在快速发展, go get 命令也在不断优化和完善,相信会变得越来越好用。

目录
相关文章
|
2月前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
2月前
|
Go
golang语言之go常用命令
这篇文章列出了常用的Go语言命令,如`go run`、`go install`、`go build`、`go help`、`go get`、`go mod`、`go test`、`go tool`、`go vet`、`go fmt`、`go doc`、`go version`和`go env`,以及它们的基本用法和功能。
53 6
|
4月前
|
XML JSON Go
Swoole与Go系列教程之WebSocket服务的应用
在 WebSocket 协议出现之前,Web 应用为了能过获取到实时的数据都是通过不断轮询服务端的接口。轮询的效率、延时很低,并且很耗费资源。
1057 2
Swoole与Go系列教程之WebSocket服务的应用
|
4月前
|
网络协议 Go
Swoole与Go系列教程之TCP服务的应用
TCP(传输控制协议)的出现是为了解决计算机网络中的数据可靠传输和连接管理的问题。在早期的计算机网络中,特别是在分组交换和互联网的发展初期,网络是不可靠的,存在丢包、错误和延迟等问题。
993 0
Swoole与Go系列教程之TCP服务的应用
|
4月前
|
Go
go 常用命令总结
go 常用命令总结
28 0
|
4月前
|
网络协议 程序员 应用服务中间件
Swoole与Go系列教程之HTTP服务的应用
PHP 曾是Web开发领域佼佼者,随着业务壮大,异步和高并发方面不足显现。Swoole 曾经尝试填补空白,但局限性也比较的明显。Go 语言的崛起,简洁语法和并发优势吸引大厂使用,吸引了大多数程序员的转型。
1004 0
Swoole与Go系列教程之HTTP服务的应用
|
5月前
|
Go
The “gopls“ command is not available. Run “go get -v golang.org/x/tools/gopls“ to install.【已解决】
The “gopls“ command is not available. Run “go get -v golang.org/x/tools/gopls“ to install.【已解决】
62 3
|
5月前
|
编译器 Go C++
必知的技术知识:go语言快速入门教程
必知的技术知识:go语言快速入门教程
|
6月前
|
Go
Go 语言教程
Go 语言教程
47 3
|
5月前
|
弹性计算 Java Serverless
Serverless 应用引擎操作报错合集之在执行环境 custom pre-deploy 时,命令 "go mod tidy" 失败了,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
414 0