GO基础总结

Go基础语法参考:https://www.cnblogs.com/vonlinee/p/19005628

环境搭建

# CentOS
yum install go

配置环境变量

# 指定Go的安装根目录
export GOROOT=/usr/local/go
# Go工作区目录(自定义,存放你的项目/依赖包,推荐默认)
export GOPATH=$HOME/go
# Goproxy镜像,解决下载依赖超时/失败,七牛云官方镜像
export GOPROXY=https://goproxy.cn,direct
# 将GO可执行文件加入PATH中,使GO指令与我们编写的GO应用可以全局调用
$PATH=$PATH:$GOBIN:$GOROOT/bin

通过 go version 查看安装的版本

➜ go version
go version go1.23.0 windows/amd64

环境变量

这三个是搭建 Go 开发环境最基本、必须了解的变量。

GOROOT

Go 语言安装的根目录。它指向 Go 的 SDK 所在位置,其中包含标准库、编译器、链接器等所有自带的工具。默认值:通常为 /usr/local/go(Unix-like)或 C:\Go(Windows)。现代版本的 Go 通常能自动设置,一般不需要手动修改。除非你安装了多个 Go 版本并需要切换。

GOPATH

在 Go Modules 出现之前,这是所有 Go 代码的工作目录。它有三个子目录:

  1. src(源代码)
  2. pkg(编译后的包文件)
  3. bin(编译后的可执行文件)。

自 Go 1.11 引入 Modules 后,GOPATH 的重要性已大大降低。但它仍然存在,主要用于存放通过 go install 安装的可执行工具(在 $GOPATH/bin 下)以及缓存旧版本(Go 1.4及之前)的包。默认值:$HOME/go(Unix-like)或 %USERPROFILE%\go(Windows)。

GOBIN

执行 go install 命令编译生成的可执行文件的存放目录。运行 go install 时,生成的可执行文件会放在此目录下。为了能在终端任何地方直接运行这些工具,强烈建议将 $GOBIN 添加到你的系统 PATH 环境变量中。默认值:默认为 $GOPATH/bin 。你可以单独设置它,例如 export GOBIN=$HOME/.local/bin

命令行工具

go env

会列出所有与 Go 相关的环境变量及其当前值。Windows下输出内容类似于下面这样:

set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\lenovo\AppData\Local\go-build
....
set GOENV=C:\Users\lenovo\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64

查看特定的环境变量:go env VARNAME,在 Windows 的 Command Prompt 或 PowerShell 中,用法基本相同。只是变量名的大小写不敏感,但通常保持大写即可。

➜ go env GOPATH			# 输出: /Users/username/go
➜ go env GOROOT			# 输出: /usr/local/go
➜ go env GOPROXY		# 输出: https://goproxy.cn,direct
➜ go env GOPATH GOROOT GOOS GOARCH
C:\Users\lenovo\go
D:\Develop\Go
windows
amd64

使用 -json 标志可以以 JSON 格式输出所有环境变量

go env -json
# 获取特定变量的 JSON 值
go env -json GOROOT GOPROXY

常用环境变量的含义如下

变量名 含义 示例值
GOPATH 工作区目录 /Users/username/go
GOROOT Go 语言安装目录 /usr/local/go
GOBIN 可执行文件安装目录 $GOPATH/bin
GOOS 目标操作系统 darwin, linux, windows
GOARCH 目标架构 amd64, arm64, 386
GOPROXY 模块代理 https://goproxy.cn,direct
GOMODCACHE 模块缓存目录 $GOPATH/pkg/mod
CGO_ENABLED 是否启用 CGO 1 (启用) 或 0 (禁用)

go build

https://pkg.go.dev/go/build

要使用Go编译单个文件,直接在文件上运行 go build <文件名.go> 即可生成可执行文件(默认与源文件名相同),或者使用 go run <文件名.go> 直接编译并运行。若想指定输出文件名,可用 go build -o <输出名> <文件名.go>。

【go build】指令的作用是:在当前目录下编译生成可执行文件。注意,go build指令会调用所有引用包的源码,重新编译,而不是直接使用pkg里的编译后文件,如果在【$GOROOT】与【$GOPATH】下没有找到import引入包的项目源码,就会报错。

go run

go run 命令用于编译并直接运行源代码,它会在后台编译程序(生成临时可执行文件)然后立即执行,执行完毕后删除临时文件,非常适合快速测试和调试,而无需手动生成和管理可执行文件。它的基本语法是 go run [文件名.go] [参数...]。

go install

https://stackoverflow.com/questions/24069664/what-does-go-install-do

主要用于编译和安装可执行文件

格式:go install 包名/包的地址

go install指令的作用是:编译源代码,如果为可执行文件(package "main"且包含main方法),则会编译生成可执行文件到 $GOPATH/bin目录下;源文件中 import 引入的其他包,就会被编译到 $GOPATH/pkg/$GOOS_$GOARCH目录下。

go install / go build

【go install】也可以完成类似【go build】的功能,区别在于【go install】会生成二进制文件到 $GOPATH/pkg/$GOOS_$GOARCH目录下

(这个二进制文件对于我们并没什么意义),但【go install】会把可执行文件自动生成到【$GOBIN】目录下,这是在一开始被配置到

【$PATH】中了,这样就可以使项目可执行文件能被方便的全局调用。

用VSCode打开go代码时,vscode提供的go插件会去执行 go install -v golang.org/x/tools/gopls@latest这个命令,安装@latest版本的gopls这个包,gopls 是 go 官方提供的lsp服务,如果@latest这个版本的gopls和你装的go版本不兼容,则会去下载合适的go版本(估计下的这个版本只是gopls自身用的)

PS C:\Users\lenovo\go> go install -v golang.org/x/tools/gopls@latest
go: downloading golang.org/x/tools v0.41.0
go: downloading golang.org/x/tools/gopls v0.21.0
go: golang.org/x/tools/gopls@v0.21.0 requires go >= 1.25; switching to go1.25.5
go: downloading go1.25.5 (windows/amd64)
......

go get

参考:https://golang.org/doc/go-get-install-deprecation
使用 go get获取 Go 语言的包,go get主要下载依赖,go install主要用于编译和安装可执行文件.

go get 可以理解为git clone到 $GOPATH/src 目录后进行 go install

下载并安装包: go get <包的导入路径>,例如 go get github.com/gin-gonic/gin

导入路径就是代码中写的import的内容,例如

import "github.com/gin-gonic/gin"
  1. 仅下载代码 (不安装): go get -d <包的导入路径>
  2. 更新包到最新版本: go get -u <包的导入路径>
  3. 同时下载测试所需的包: go get -t <包的导入路径>
  4. 下载指定版本的包,只需在包路径后添加 @ 符号和版本号,例如 go get <package_path>@<version>,即可下载该特定版本并更新 go.mod 文件,支持标签 (tag) 或提交哈希。

go get下载的包通常存放在 $GOPATH/pkg/mod目录中(Go Modules模式),如果是可执行文件则放在 $GOPATH/bin目录。具体路径可以通过运行 go env GOPATH命令查看,pkg/mod 缓存了所有依赖项,而 bin 存放编译好的二进制工具.

  1. 依赖包(Modules): $GOPATH/pkg/mod,在这个目录下,Go按模块名称和版本号(如 github.com)存放下载的依赖库.
  2. 可执行文件: $GOPATH/bin,使用 go install 或 go get(针对工具)安装的二进制程序会放在这里,并不是所有包都会有二进制程序

go get github.com/urfave/cli为例,它被下载到了 $GOPATH/pkg/mod 目录下:

$ go get github.com/urfave/cli
go: downloading github.com/urfave/cli v1.22.17
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.7
go: downloading github.com/russross/blackfriday/v2 v2.1.0
go: added github.com/cpuguy83/go-md2man/v2 v2.0.7
go: added github.com/russross/blackfriday/v2 v2.1.0
go: added github.com/urfave/cli v1.22.17

root@localhost ~/go/pkg/mod/github.com/urfave
drwxr-xr-x 1 root 197121 0  1月 14 22:58 'cli@v1.22.17'/

可以和Github上指定版本的release对比一下:https://github.com/urfave/cli/releases/tag/v1.22.17 ,发现基本上是一样的,估计就和我们直接通过 github 下载是一样的,下载到本地然后解压而已

go mod

Go 1.11+ 版本用于管理项目依赖的核心工具,替代了之前的 GOPATH 模式,让依赖管理更简洁、项目更独立。Go 项目 必须开启 go mod (Go 1.16 及以上版本 默认开启 ,无需手动配置),如果是旧版本 Go,提前执行开启命令:

export GO111MODULE=on  # Linux/Mac 临时开启,永久配置加进.zshrc/.bash_profile
set GO111MODULE=on     # Windows cmd/PowerShell

下面来说明通过命令行创建一个项目的步骤

go mod init hello

在当前目录下创建一个 go.mod 文件

> go mod init hello
go: creating new go.mod: module hello
go: to add module requirements and sums:
        go mod tidy

$ ll
total 1
-rw-r--r-- 1 lenovo 197121 24  1月 14 22:43 go.mod

创建源码文件 main.go

package main

import "fmt"

func main() {
   fmt.Println("Hello, World!")
}

编译并运行:go run main.go

go.mod 文件

项目的「依赖清单」,纯文本文件,在项目根目录,由 go mod init 项目名初始化生成;里面记录了: 项目模块名Go 版本项目需要的所有依赖包 + 对应的版本号

$ cat go.mod
module hello

go 1.23.0

require (
	// indirect表示传递依赖
        github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
        github.com/russross/blackfriday/v2 v2.1.0 // indirect
        github.com/urfave/cli v1.22.17 // indirect
)

go.sum 文件

项目的「依赖校验文件」,纯文本文件,自动生成,无需手动修改;里面记录了: 所有依赖包的版本哈希值(校验和)

作用:防篡改、验真伪 → 下次下载依赖时,Go 会对比下载包的哈希值和 go.sum记录的是否一致,一致才会使用,避免依赖包被恶意修改或下载到损坏的包;

go mod tidy会同步增删这个文件的校验记录,和 go.mod的依赖清单一一对应。

特别说明:

  1. 如果源文件里只import了内置包,没有第三方包,执行 go mod tidy 是不会生成 go.sum 文件的
  2. 执行 go get 时也会更新 go.sum 文件

go mod tidy

自动同步项目的依赖关系,让 go.modgo.sum 文件,与项目中 import 导入的包 保持绝对一致 。这包含两层意思:

1. 清理冗余依赖

2. 补齐缺失依赖

这个命令的执行逻辑就是「双向校验 + 自动修正」,执行时会 全盘扫描你的项目所有.go 源码文件 ,分析所有 import语句,然后执行:

自动下载【缺失】的依赖包

你的代码里 import了某个第三方包 / 自定义包,但 go.mod/go.sum 里没有记录这个依赖、本地也没有缓存 → go mod tidy 会自动从远程仓库(通过你的 GOPROXY配置)下载这个依赖,同时把依赖的 版本信息校验信息分别写入 go.modgo.sum 文件,保证项目能正常编译运行。

你从 Git 拉取了一个别人的 Go 项目,执行 go run main.go提示 missing module xxx,执行 go mod tidy即可一键补齐所有缺失依赖。

自动删除【未使用】的冗余依赖

你的 go.mod/go.sum 里记录了某些依赖包,但你的项目源码中没有任何地方 import / 使用这些包 → go mod tidy 会自动把这些「无用依赖」从 go.mod(require 段)和 go.sum 中删除,同时清理本地缓存中对应的无用包。

场景举例:你开发时引入了 github.com/gin-gonic/gin,后来需求变更删掉了相关代码,此时 go.mod还残留这个依赖,执行命令即可一键清理。

依赖包的下载位置

go mod tidy下载的所有依赖包, 不会下载到你的项目目录里 ,而是统一缓存到 系统全局缓存目录

  • Linux/Mac 系统:$GOPATH/pkg/mod (默认 GOPATH~/go,完整路径 ~/go/pkg/mod
  • Windows 系统:%GOPATH%\pkg\mod

优点:所有 Go 项目共享一份依赖缓存,不会重复下载,节省磁盘空间;同一个依赖包同一个版本,本地只会存一份。

依赖包的版本选择

go mod tidy会遵循「 最小可用版本 」原则自动选择依赖版本:

  1. 优先匹配 go.mod中已声明的版本;
  2. 如果未声明,会自动下载该依赖的 最新稳定版
  3. 如果项目有版本兼容问题,你可以手动在 go.mod中指定版本,再执行 go mod tidy即可生效。

基本语法

参见:https://www.cnblogs.com/vonlinee/p/19005628

包管理

使用import关键字,导入要使用的标准库包或第三方依赖包。

import "a/b/c"
import "fmt"

模块

https://golang.org/ref/mod

模块是Go语言管理依赖关系的方式。模块是一组被一起发布、版本控制和分发的包的集合。模块可以直接从版本控制仓库或模块代理服务器下载。

有关模块的一系列教程,请参阅 https://golang.org/doc/tutorial/create-module。

默认情况下,go 命令可能会从 https://proxy.golang.org 下载模块。
它可以使用位于https://sum.golang.org的校验和数据库来验证模块。这两项服务均由谷歌的Go团队运营。
这些服务的隐私政策分别可在https://proxy.golang.org/privacy和https://sum.golang.org/privacy查阅。

go 命令的下载行为可以通过 GOPROXY、GOSUMDB、GOPRIVATE 和其他环境变量进行配置。有关更多信息,请参阅“go help environment”和 https://golang.org/ref/mod#private-module-privacy。

以下 3 种依赖管理方式

GOPATH模式

GOPATH 模式是 Go 语言在 1.11 版本之前唯一的工作模式,已被 Go Modules 取代

GOPATH 模式要求所有的 Go 代码(包括自己的项目和第三方依赖库)都必须放在一个单一的工作区目录下,这个目录就是 GOPATH

它没有版本的概念,你直接使用代码库的最新代码(默认是 master 分支或默认分支)。

$GOPATH工作目录结构,约定有三个子目录(需要自行创建):

1. src ——存放源代码文件
2. pkg——存放编译后的文件
3. bin ——存放编译后的可执行文件

多个项目最好都在一个 $GOPATH下,即 $GOPATH/src/项目1$GOPATH/src/项目2

go vendor

go vendor 命令(通常指 go mod vendor 或第三方工具 govendor)是 Go 语言中管理项目依赖的机制,其核心是将项目所需的所有依赖包复制到项目根目录下的 vendor 文件夹中,以实现离线构建、版本锁定和保证构建一致性,其中 go mod vendor 是 Go 1.14+ 推荐的官方方式。

go mod vendor (官方 Go Modules 方式)

  1. go mod vendor: 创建或更新 vendor 目录,将 go.mod 中声明的依赖及其版本复制到 vendor。
  2. go build -mod=vendor: 使用 vendor 目录中的依赖进行构建。
    作用: 确保项目在任何环境都能使用指定版本的依赖,实现可重复构建。

这种模式下:包 github.com/$USER/$REPO会在本地目录 vendor/github.com/$USER/$REPO/目录下进行搜索

PS C:\Users\lenovo> go mod vendor
go: go.mod file not found in current directory or any parent directory; see 'go help modules'

go module

Go Modules 是现代的依赖管理系统,以下变量控制其行为。

  1. GOMODCACHE
    • 含义:Go Module 的缓存目录。所有下载的依赖包(包括特定版本)都会存储在这里。
    • 默认值$GOPATH/pkg/mod
    • 用途:你可以通过设置此变量来改变依赖包的缓存位置,例如将其放在更大的硬盘分区上。
  2. GOPROXY
    • 含义:Go Module 代理服务器的地址。用于加速依赖包的下载和提供稳定的可用性。
    • :是一个逗号分隔的 URL 列表,也可以是特殊值 direct(直连代码仓库)或 off(禁用网络)。
    • 推荐设置https://goproxy.cn,direct(适用于中国大陆,将 goproxy.io 或官方 proxy.golang.org 替换为国内镜像源以大幅提升下载速度)。
    • 工作流程:Go 工具会按顺序尝试列表中的代理,直到成功为止。最后的 direct 表示如果所有代理都失败,则直接尝试连接版本控制系统(如 GitHub)。
  3. GOSUMDB
    • 含义:Go Checksum Database 的地址。用于验证下载的依赖包是否未被篡改,确保安全。
    • 默认值sum.golang.org
    • 注意:访问此数据库可能较慢或不可用。如果你使用了可信的国内代理(如 goproxy.cn),通常会配备自己的校验数据库,通常不需要单独修改。在特殊内网环境下可设置为 off 来关闭校验(不推荐)。
  4. GOPRIVATE / GONOPROXY / GONOSUMDB
    • 用于控制哪些私有模块(例如公司内部的 GitLab 仓库)通过公共代理 (GOPROXY) 下载,也进行公共校验和校验 (GOSUMDB)。
    • :逗号分隔的模块路径前缀 glob 模式列表(如 *.company.com,github.com/yourname/private-repo)。
    • GOPRIVATE 设置了,就自动同时设置了 GONOPROXYGONOSUMDB
    • 也可以单独精细控制 GONOPROXYGONOSUMDB

代理配置

设置 CDN 加速代理,以下是几个速度不错的提供者:

  1. 七牛:Goproxy 中国 https://goproxy.cn
  2. 阿里: mirrors.aliyun.com/goproxy/
  3. 官方: < 全球 CDN 加速 https://goproxy.io/>
  4. 其他:jfrog 维护 https://gocenter.io

在 Linux 或 macOS 上面,需要运行下面命令(或者,可以把以下命令写到 .bashrc 或 .bash_profile 文件中):

# 启用 Go Modules 功能
go env -w GO111MODULE=on

# 配置 GOPROXY 环境变量,以下三选一
# 1. 七牛 CDN
go env -w  GOPROXY=https://goproxy.cn,direct
# 2. 阿里云
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
# 3. 官方
go env -w  GOPROXY=https://goproxy.io,direct

Windows 上配置:

# 启用 Go Modules 功能
$env:GO111MODULE="on"

# 配置 GOPROXY 环境变量,以下三选一
# 1. 七牛 CDN
$env:GOPROXY="https://goproxy.cn,direct"
# 2. 阿里云
$env:GOPROXY="https://mirrors.aliyun.com/goproxy/,direct"
# 3. 官方
$env:GOPROXY="https://goproxy.io,direct"

通过 go env GOPROXY 验证是否设置成功

离线安装

https://stackoverflow.com/questions/69603001/golang-offline-install-third-party-package

只有包的 github 地址


私有模块

如果使用的 Go 版本 >=1.13, 可以通过设置 GOPRIVATE 环境变量来控制哪些私有仓库和依赖 (公司内部仓库) 不通过 proxy 来拉取,直接走本地:

# Go version >= 1.13
go env -w GOPROXY=https://goproxy.cn,direct
# 设置不走 proxy 的私有仓库,多个用逗号相隔
go env -w GOPRIVATE=*.corp.example.com

工具链

https://go.dev/doc/toolchain

posted @ 2025-09-18 22:04  vonlinee  阅读(11)  评论(0)    收藏  举报