Go基础之环境搭建

文章目录
  • [1 Go](#1 Go)
    • [1.1 简介](#1.1 简介)
      • [1.1.1 定义](#1.1.1 定义)
      • [1.1.2 特点用途](#1.1.2 特点用途)
    • [1.2 环境配置](#1.2 环境配置)
      • [1.2.1 下载安装](#1.2.1 下载安装)
      • [1.2.2 环境配置](#1.2.2 环境配置)
        • [1.2.2.1 添加环境变量](#1.2.2.1 添加环境变量)
        • [1.2.2.2 各个环境变量理解](#1.2.2.2 各个环境变量理解)
      • [1.2.3 验证环境变量](#1.2.3 验证环境变量)
    • [1.3 包管理工具 Go Modules](#1.3 包管理工具 Go Modules)
      • [1.3.1 开启使用](#1.3.1 开启使用)
      • [1.3.2 添加依赖包](#1.3.2 添加依赖包)
      • [1.3.3 配置国内包源](#1.3.3 配置国内包源)
        • [1.3.3.1 通过 go env 配置](#1.3.3.1 通过 go env 配置)
        • [1.3.3.2 修改环境变量](#1.3.3.2 修改环境变量)
      • [1.3.4 更新和管理依赖](#1.3.4 更新和管理依赖)
      • [1.3.5 没有域名时项目操作](#1.3.5 没有域名时项目操作)
      • [1.3.6 go.mod](#1.3.6 go.mod)
        • [1.3.6.1 文件介绍](#1.3.6.1 文件介绍)
        • [1.3.6.2 操作 go.mod 的常用命令](#1.3.6.2 操作 go.mod 的常用命令)
      • [1.3.7 go.sum](#1.3.7 go.sum)
        • [1.3.7.1 文件介绍](#1.3.7.1 文件介绍)
        • [1.3.7.2 管理 go.sum 文件](#1.3.7.2 管理 go.sum 文件)
    • [1.4 常用命令](#1.4 常用命令)
      • [1.4.1 Go Modules 常用命令](#1.4.1 Go Modules 常用命令)
        • [1.4.1.1 模块初始化](#1.4.1.1 模块初始化)
        • [1.4.1.2 添加依赖](#1.4.1.2 添加依赖)
        • [1.4.1.3 移除未使用的依赖](#1.4.1.3 移除未使用的依赖)
        • [1.4.1.4 下载所有依赖](#1.4.1.4 下载所有依赖)
        • [1.4.1.5 查看依赖列表](#1.4.1.5 查看依赖列表)
        • [1.4.1.6 检查依赖更新](#1.4.1.6 检查依赖更新)
        • [1.4.1.7 替换依赖](#1.4.1.7 替换依赖)
        • [1.4.1.8 移除模块中的依赖](#1.4.1.8 移除模块中的依赖)
        • [1.4.1.9 验证依赖](#1.4.1.9 验证依赖)
        • [1.4.1.10 查看模块路径](#1.4.1.10 查看模块路径)
      • [1.4.2 开发中的常用命令](#1.4.2 开发中的常用命令)
        • [1.4.2.1 编译并运行项目](#1.4.2.1 编译并运行项目)
        • [1.4.2.2 构建可执行文件](#1.4.2.2 构建可执行文件)
        • [1.4.2.3 安装依赖工具](#1.4.2.3 安装依赖工具)
        • [1.4.2.4 清理模块缓存](#1.4.2.4 清理模块缓存)
      • [1.4.3 依赖调试与版本控制](#1.4.3 依赖调试与版本控制)
        • [1.4.3.1 强制使用特定版本](#1.4.3.1 强制使用特定版本)
        • [1.4.3.2 显示依赖关系](#1.4.3.2 显示依赖关系)

1 Go

1.1 简介

1.1.1 定义

Go语言,也被称为Golang,是一种由Google开发的静态类型、编译型编程语言,是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。

官方网站:https://go.dev/

中文网站:https://studygolang.com/

1.1.2 特点用途

Go语言的特点:

  • 编译型语言:
    Go语言通过编译生成机器码,因此具有较高的运行效率,接近C语言的性能。
  • 并发编程支持:
    Go语言内置了轻量级的并发支持,通过goroutine和channel实现高效的并发编程。这使得Go语言非常适合开发高并发应用,如网络服务器、分布式系统等。
  • 简洁的语法:
    Go语言的语法简洁明了,易于学习和使用,降低了编程的复杂性。
  • 自动垃圾回收:
    Go语言具有自动垃圾回收机制,可以有效避免内存泄漏问题,减轻了开发者对内存管理的负担。
  • 跨平台支持:
    编译后的Go程序可以在不同操作系统上运行,如Windows、Linux、macOS等。
  • 标准库丰富:
    Go语言提供了丰富的标准库,包含了许多实用的工具和功能,如网络编程、文件操作、加密等,方便开发者快速构建软件系统。
  • 工具链完善:
    Go语言拥有一个完善的工具链,包括代码格式化工具(gofmt)、性能分析工具(go tool pprof)、测试工具(go test)等,这些工具有助于提高开发效率和代码质量。

Go语言的用途:

  • 服务器端开发:
    Go语言非常适合用于开发高性能的Web服务器和API服务。使用Go语言开发的Gin和Beego等框架,能够高效地处理HTTP请求。
  • 云计算:
    Go语言是云计算领域的重要编程语言。许多云服务、云应用程序都是用Go语言开发的。例如,Google的Kubernetes容器编排系统和Docker容器化平台都是用Go语言编写的。
  • 大数据处理:
    Go语言在处理大规模数据时表现出色。得益于其高效的并发支持,Go语言能够显著提升数据处理性能。
  • 系统编程:
    Go语言也可以用于开发操作系统、网络工具等系统软件。
  • 网络编程:
    Go语言提供了简洁而强大的网络编程库,使得开发网络应用程序变得简单和高效。
  • 静态分析工具:
    Go语言的简洁性和灵活性使其成为开发静态分析工具的理想选择。
  • 命令行工具:
    许多高效的命令行工具都是用Go语言编写的。
  • 物联网开发:
    Go语言具有运行效率高、并发编程支持强等特点,非常适合物联网开发。
  • 区块链开发:
    Go语言的安全性和高效性使其成为区块链开发的首选语言之一。以太坊、Hyperledger Fabric等知名区块链平台均使用Go语言作为核心开发语言。

1.2 环境配置

1.2.1 下载安装

访问国内Go语言网站:Go语言中文网

1.2.2 环境配置
1.2.2.1 添加环境变量

win+e打开,右击此电脑,选择属性,搜索查看高级系统设置,点击环境变量

添加变量:

  • 设置 GOROOT(安装路径):
    点击系统变量下的新建
    名称:GOROOT,值:C:Program FilesGo(Go 的安装路径
  • 设置 GOPATH(项目路径):
    GOPATH 是 Go 项目工作目录
    新建一个目录,例如 D:GoWorkspace。
    在系统变量中添加:
    名称:GOPATH,值:D:GoWorkspace。
  • 添加 PATH
    找到系统变量中的 Path,点击编辑
    添加以下路径:
    %GOROOT%inGo 的可执行文件路径)。
    %GOPATH%inGOPATH 的 bin 目录)。
1.2.2.2 各个环境变量理解
  • GOROOT 作用
    GOROOTGo 的安装路径,用于告诉 Go 工具链(如 go buildgo run)Go 的核心库在哪里。
    默认情况下,Go 的安装程序会自动检测其安装路径并设置好 GOROOT,因此 通常不需要手动添加 GOROOT 环境变量。
    那么就,是否需要在环境变量中手动添加?如果GOROOTGo 的默认路径(如 C:Program FilesGo),且未修改过安装路径,无需手动添加 GOROOT。但是,如果 Go 安装到了非默认路径,或者 Go 工具链出现了找不到标准库的问题,那么可以手动设置 GOROOT。
  • GOPATH 作用
    GOPATH 是 Go 项目的工作空间目录,用于存储源码、依赖包和生成的二进制文件。
    它是 Go 1.x 的工作机制(在 Go Modules 之前非常重要),用来组织代码结构。
    • GOPATH 必要性
      如果使用的是 Go Modules(现代 Go 的推荐方式),GOPATH 的作用大大降低,但仍有以下场景需要:
      • 编译后的可执行文件会存放在 GOPATH/bin 中。
      • 某些工具(如 go install)仍然默认依赖 GOPATH。
      • 在不使用 Go Modules 的老项目中,GOPATH 是必需的。
    • 为什么还要添加 GOPATH/binPATH
      当用 go install 安装工具(如 golangci-lint、dlv)时,生成的可执行文件会存放到 GOPATH/bin 下。
      GOPATH/bin 添加到 Path 中,方便在全局运行这些工具。
    • 是否需要添加 GOPATH
      如果项目完全基于 Go Modules,可以不显式配置 GOPATH
      如果需要兼容老项目,或安装工具包,建议配置。
    • 是否需要添加 GOPATH/binPATH
      必须添加,否则用 go install 安装的工具无法直接在命令行中使用。
  • 实际建议
    根据现代 Go 的实践,以下是建议的简化配置:
    • GOROOT:不需要手动设置(如果使用默认安装路径)。
    • GOPATH:对于大多数现代项目(使用 Go Modules),只需设置一个工作目录(如 D:GoWorkspace)作为 GOPATH。将 GOPATH/bin 添加到系统 PATH,方便全局使用工具。
1.2.3 验证环境变量

打开新的命令行窗口,运行以下命令:

复制代码
go env

确保输出的 GOROOT 和 GOPATH 正确。

1.3 包管理工具 Go Modules

1.3.1 开启使用

Go ModulesGo 语言推荐的依赖管理方式。

启用 Go Modules:

复制代码
go env -w GO111MODULE=on

现在的新版本 Go(1.16 及更高版本)默认已经启用了 Go Modules,因此在一般情况下,不需要手动设置 GO111MODULE

检查是否成功:

复制代码
go env | findstr GO111MODULE

初始化项目, 在项目目录下运行:

复制代码
go mod init <模块名称>

例如,创建一个模块名称为 example.com/mymodule 的项目:

复制代码
go mod init example.com/mymodule

这会生成一个 go.mod 文件,内容类似如下:

复制代码
module example.com/mymodule

go 1.20

运行项目:

复制代码
go run .
1.3.2 添加依赖包

当在代码中引入第三方包时(例如 github.com/gin-gonic/gin),Go 会自动解析并下载依赖包。

例如,编写代码:

复制代码
package main

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

func main() {
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{"message": "Hello, World!"})
    })
    r.Run()
}

运行:

复制代码
go mod tidy

这会下载所需的依赖包并更新 go.mod 和 go.sum 文件。
go.mod 记录了直接依赖go.sum 记录了依赖的校验信息。

1.3.3 配置国内包源

由于网络原因,下载依赖包时可能会很慢,建议更换为国内包源。

1.3.3.1 通过 go env 配置

设置 Go Modules 使用国内代理:

复制代码
go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com,direct

验证配置:

复制代码
go env | findstr GOPROXY

输出类似:

复制代码
GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com,direct
1.3.3.2 修改环境变量

如果不想每次都设置,可以直接在系统环境变量中添加 GOPROXY

打开环境变量设置,添加一个新变量:

  • 名称:GOPROXY
  • 值:https://goproxy.cn,https://mirrors.aliyun.com,direct

GOPROXY 可以配置多个代理地址,并用逗号(,)分隔。Go 会按照顺序依次尝试这些代理,直到找到一个可用的

这里加 direct 表示如果在指定的代理服务器上找不到模块,Go 会直接尝试从模块源(如 Git 仓库)下载依赖。这是一种后备机制,确保即使代理不可用,依赖仍有机会通过源下载。

1.3.4 更新和管理依赖
  • 下载和清理依赖:
    go mod tidy:这会添加缺失的依赖,并移除未使用的依赖。
  • 查看依赖包:
    go list -m all
  • 升级依赖:
    go get -u <包名>
    例如,升级 Gin:
    go get -u github.com/gin-gonic/gin
  • 指定依赖版本:
    编辑 go.mod 文件,直接指定版本:
    require github.com/gin-gonic/gin v1.9.0
    然后运行:go mod tidy
1.3.5 没有域名时项目操作

如果没有域名,又想避免将来迁移麻烦,可以使用以下方式:

本地开发时使用简单名称:

复制代码
go mod init myproject

以后需要发布时再修改: 修改 go.mod 文件的 module 字段即可,比如:

复制代码
module github.com/username/myproject

结合私有模块代理: 如果项目是私有的,可以使用 GOPRIVATE 指定私有模块地址:

复制代码
go env -w GOPRIVATE=company.com
1.3.6 go.mod
1.3.6.1 文件介绍

go.modGo Modules 的核心文件,用来定义模块及其依赖项。

一个典型的 go.mod 文件可能包含以下内容:

复制代码
module example.com/mymodule

go 1.20

require (
    github.com/gin-gonic/gin v1.9.0
    golang.org/x/net v0.5.0
)

各部分含义:

  • module: 定义模块的名称(通常是项目的根路径)。模块名称决定了这个项目在其他地方引入时的路径。
  • go: 指定最低支持的 Go 版本。例如,go 1.20 表示此模块要求 Go 1.20 或更高版本。
  • require: 列出此模块的直接依赖包及其版本。
  • replace(可选): 用于替换依赖包的路径或版本,常用于本地开发或依赖修复。
    replace github.com/example/foo => ../local/foo
  • exclude(可选): 指定不允许使用的模块版本。
    exclude github.com/example/foo v1.2.3
1.3.6.2 操作 go.mod 的常用命令

初始化模块:

复制代码
go mod init <module-name>

添加依赖:

复制代码
go get <package>@<version>

自动管理依赖(清理未使用的依赖,并自动添加缺失的依赖):

复制代码
go mod tidy
1.3.7 go.sum
1.3.7.1 文件介绍

go.sumgo.mod 的配套文件,用于记录模块依赖的校验信息,确保依赖的完整性一致性

作用:

  • 完整性验证: 在拉取依赖包时,Go 会校验包的实际内容是否与 go.sum 文件中的哈希值一致,防止依赖被篡改。
  • 缓存优化: 记录的校验值使得 Go 工具可以高效地在本地或远程缓存中找到匹配的依赖包。

一个典型的 go.sum 文件内容如下:

复制代码
github.com/gin-gonic/gin v1.9.0 h1:4Fq34...
github.com/gin-gonic/gin v1.9.0/go.mod h1:kf4B...
golang.org/x/net v0.5.0 h1:3jHk...
golang.org/x/net v0.5.0/go.mod h1:Lsk4...

各部分含义:

  • 每一行记录一个依赖包的校验信息。
  • 每个依赖包有两类记录:
    • <模块名> <版本> <校验值>:依赖包的完整内容校验值。
    • <模块名> <版本>/go.mod <校验值>:依赖包的 go.mod 文件校验值。
1.3.7.2 管理 go.sum 文件
  • 自动生成: 当运行 go mod tidy 或使用依赖时,go.sum 会自动更新。
  • 不要手动修改: go.sum 是由 Go 工具自动维护的,手动修改可能导致校验错误。

1.4 常用命令

1.4.1 Go Modules 常用命令
1.4.1.1 模块初始化
复制代码
go mod init <module-name>

初始化一个新的模块。

会在当前目录下生成 go.mod 文件。

示例:

复制代码
go mod init example.com/mymodule
1.4.1.2 添加依赖
复制代码
go get <package>@<version>

下载指定的依赖包并更新 go.modgo.sum 文件。
@<version> 可选,不指定时默认获取最新版本。

示例:

复制代码
go get github.com/gin-gonic/gin@v1.9.0

如果省略版本:

复制代码
go get github.com/gin-gonic/gin

会安装最新稳定版。

1.4.1.3 移除未使用的依赖
复制代码
go mod tidy

自动清理未使用的依赖包,并下载缺失的依赖。

同时更新 go.modgo.sum 文件。

1.4.1.4 下载所有依赖
复制代码
go mod download

下载 go.mod 文件中列出的所有依赖包到本地模块缓存。

1.4.1.5 查看依赖列表
复制代码
go list -m all

列出当前模块的所有依赖及其版本(包括直接和间接依赖)。

1.4.1.6 检查依赖更新
复制代码
go list -u -m all

列出所有依赖,并显示可以更新的版本(如果有)。

1.4.1.7 替换依赖

go.mod 文件中添加 replace 指令,替换依赖的路径或版本。

复制代码
replace github.com/example/foo => ../local/foo

替换为本地路径版本。

更新依赖后,运行:

复制代码
go mod tidy
1.4.1.8 移除模块中的依赖

手动删除代码中不需要的依赖后运行:

复制代码
go mod tidy

这会从 go.mod 中移除未使用的依赖。

1.4.1.9 验证依赖
复制代码
go mod verify

验证所有依赖的校验值是否与 go.sum 文件一致,用于检查依赖包是否被篡改。

1.4.1.10 查看模块路径
复制代码
go env GOMOD

输出当前模块的 go.mod 文件路径。如果没有使用 Go Modules,输出为空。

1.4.2 开发中的常用命令
1.4.2.1 编译并运行项目
复制代码
go run .

在当前模块中运行主程序文件。

1.4.2.2 构建可执行文件
复制代码
go build

在当前目录下生成可执行文件。

使用 Go Modules 时,会自动管理依赖。

1.4.2.3 安装依赖工具
复制代码
go install <package>

将指定的模块安装到 GOPATH/bin 或配置的 GOBIN 目录下,其的核心功能是 编译并安装 Go 工具或程序,而不是直接管理依赖。具体来说:将指定的模块或包编译成可执行文件,并安装到 GOBIN 或 GOPATH/bin 目录下

1.4.2.4 清理模块缓存
复制代码
go clean -modcache

清理本地模块缓存(默认存储在 ~/.cache/go-build)。

1.4.3 依赖调试与版本控制
1.4.3.1 强制使用特定版本
复制代码
go get <package>@v1.2.3

强制将依赖包的版本降级或升级到指定版本。

1.4.3.2 显示依赖关系
复制代码
go mod graph

生成依赖关系的图形表示(文本形式)。

相关推荐
IguoChan42 分钟前
D2L(1) — 线性回归
后端
梅花1444 分钟前
基于Django房屋租赁系统
后端·python·django·bootstrap·django项目·django网站
提笔了无痕1 小时前
go web开发表单知识及表单处理详解
前端·后端·golang·web
qq_12498707531 小时前
基于SpringBoot技术的企业请假审批管理系统的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·信息可视化·毕业设计
Yue丶越1 小时前
【C语言】自定义类型:联合体与枚举
c语言·开发语言
小哀21 小时前
🌸 入职写了一个月全栈next.js 感想
前端·后端·ai编程
ziwu1 小时前
【民族服饰识别系统】Python+TensorFlow+Vue3+Django+人工智能+深度学习+卷积网络+resnet50算法
人工智能·后端·图像识别
程序员Easy哥1 小时前
ID生成器第一讲:原理和常见几种生成器
后端
q***73551 小时前
SpringBoot中使用TraceId进行日志追踪
spring boot·后端·状态模式