Go环境搭建与环境变量详解

Go简单介绍

Go是一种新的语言,是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。它具有以下特点:

  • 编译速度快。
  • 更加容易的依赖分析。
  • Go是静态类型的语言,面向对象语言更轻量级。
  • Go完全是垃圾回收型的语言,并为并发执行与通信提供了基本的支持。

Go是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。

Go环境安装

Go有三种安装方式,包括 Go标准包安装(推荐这种安装方式),第三方工具安装,Go源码安装。

本文主要讲解的 Mac 安装方式: 下载安装包地址: 下载地址

然后一路默认安装点击下一步。

安装完成之后,在终端运行 go version,如果显示类似下面的信息,表明安装成功(备注:darwin(其实就是 macOS)和 amd64 分别是操作系统和CPU架构)。

bash 复制代码
go version go1.19 darwin/amd64

Go环境变量配置

  1. 打开终端输入cd ~
  2. 输入ls -all 命令查看是否存在 .bash_profile
  3. 存在使用vi .bash_profile打开文件(不存在则创建一个新的)
  4. 编辑文件,添加以下代码(GOPATH主要配置工作目录,GOROOT主主要配置Go安装包位置)
bash 复制代码
export GOROOT=/usr/local/go
export GOPATH=/Users/your mac user/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
  1. 重新载入环境变量配置 source ~/.bash_profile
  2. 最终输入 go env 打印Go所有默认环境变量

注意:如果没有进行环境变量配置,Go在执行的时候找不到环境变量,此时会找默认配置,默认配置的目录在 /Users/rock/Library/Application Support/go/env" (通过 go env GOENV 可以具体位置) 查看文件后会发现,这些环境变量值都是默认的。

GO中环境变量介绍

GOROOT

环境变量GOROOT表示Go语言的安装目录。

此值尽量不要修改,保持默认值即可。如果乱改了,然后发现无法在控制台中使用go命令了,需要修改环境变量中的值与其保持一致。

GOPATH

环境变量GOPATH用于指定我们的开发工作区(workspace),是存放源代码、测试文件、库静态文件、可执行文件的工作。 这里面存放了一些

GOPATH的值不能与GOROOT相同。

在GOPATH中设置多个工作区,例如: export GOPATH=/Users/your mac user/go/go;$home/go

GOPATH目录下的每个工作一般分为三个子目录:src,pkg,bin. 第二目录中也是需要这三个目录的。

  • src:目录放的是我们开发的源代码文件,其下面对应的目录称为包.
  • pkg:编译后生成的文件(.a文件)(非main函数的文件在go install后生成)
  • bin:放的是源代码编译后台的可执行文件.

GOBIN

环境变量GOBIN表示我们开发程序编译后二进制命令的安装目录。

当我们使用go install命令编译和打包应用程序时,该命令会将编译后二进制程序打包GOBIN目录,一般我们将GOBIN设置为GOPATH/bin目录。

GO111MODULE

go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用。默认值为空,即go判断开不开启module的依据是看当前项目的根目录下有没有go.mod文件,当然我们也可手动更改为 on(全部开启)/ off(全部不开启,不建议):

go env -w GO111MODULE=on

GOPROXY

GOPROXY就是设置Golang的全局代理。在下载依赖包的时候,一般是访问github的仓库,国内的环境很容易被墙,所以最好设置一个速度快的代理。

Go在此版本中GOPROXY的默认值为https://proxy.golang.org 国内是无法访问的。因此,这里推荐使用七牛云的代理https://goproxy.cn

go env -w GOPROXY=https://goproxy.cn,direct

GOMODCACHE

即存储go下载的外部依赖模块文件的目录,默认值为$GOPATH/pkg/mod,因此我们一般只需要更改GOPATH的值即可,此环境变量的值就会自动做出相应的变动。当然你也可以设置为其他值。

编写代码

GOPATH 目录的src下创建 main.go, 并输入代码:

go 复制代码
package main
import "fmt"

func mian() {
    fmt.Println("hello world") 
}

运行代码: go run main.go 就可以看到对应的输出。

执行 go build 会将文件编译为可执行程序。

使用 Go Module

  • 初始化: go mod init [module 名称]
  • 检测和清理依赖:go mod tidy
  • 安装指定包: go get -v github.com/go-ego/gse@v0.60.0-rc4.2
  • 更新依赖: go get -u

常用的命令:

csharp 复制代码
go mod init  # 初始化 go.mod
go mod tidy  # 更新依赖文件
go mod download  # 下载依赖文件

go mod vendor  # 将依赖转移至本地的 vendor 文件
go mod edit  # 手动修改依赖文件
go mod graph  # 打印依赖图
go mod verify  # 校验依赖

Go 命令

go build

  • 如果是普通包,当你执行go build之后,它不会产生任何文件。如果你需要在$GOPATH/pkg下生成相应的文件,那就得执行go install

  • 如果是main包,当你执行go build之后,它就会在当前目录下生成一个可执行文件。如果你需要在$GOPATH/bin 下生成相应的文件,需要执行go install,或者使用go build -o 路径/a.exe

  • 如果某个项目文件夹下有多个文件,而你只想编译某个文件,就可在go build之后加上文件名,例如go build a.gogo build命令默认会编译当前目录下的所有go文件。

  • 你也可以指定编译输出的文件名。我们可以指定go build -o astaxie.exe,默认情况是你的package名(非main包),或者是第一个源文件的文件名(main包)。

(注:实际上,package名在Go语言规范中指代码中package后使用的名称,此名称可以与文件夹名不同。默认生成的可执行文件名是文件夹名。)

go build会忽略目录下以_.开头的go文件。

参数这里就不介绍了。

go clean

这个命令是用来移除当前源码包和关联源码包里面编译生成的文件。这些文件包括

scss 复制代码
_obj/            旧的object目录,由Makefiles遗留
_test/           旧的test目录,由Makefiles遗留
_testmain.go     旧的gotest文件,由Makefiles遗留
test.out         旧的test记录,由Makefiles遗留
build.out        旧的test记录,由Makefiles遗留
*.[568ao]        object文件,由Makefiles遗留

DIR(.exe)        由go build产生
DIR.test(.exe)   由go test -c产生
MAINFILE(.exe)   由go build MAINFILE.go产生
*.so             由 SWIG 产生

go fmt

go强制了代码格式,可以用此命令来格式化文件。

go get

这个命令在内部实际上分成了两步操作:第一步是下载源码包,第二步是执行go install

go install

这个命令在内部实际上分成了两步操作: 第一步是生成结果文件(可执行文件或者.a包), 第二步会把编译好的结果移到$GOPATH/pkg或者$GOPATH/bin

go test

执行这个命令,会自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件。

go run

编译并运行Go程序

相关推荐
研究司马懿15 小时前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
梦想很大很大1 天前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰1 天前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘2 天前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤2 天前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt112 天前
AI DDD重构实践
go
Grassto4 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto5 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室6 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题6 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo