GO环境及初始化项目
补充说明:由于VS Code对go mod模式的支持暂时还不够完善,建议大家使用Goland编辑器。
Go的安装
安装基本还是之前的老样子,不过现在的安装早已省事不少,不再需要配置环境变量。直接去官网,下载了安装包后直接安装即可
在Go中文网进行Go最新版安装包的下载(或者复制网址浏览器打开https://studygolang.com/dl)
不管是Windows还是MacOS都是非常简单快捷,将安装包下载好后直接一步到位next即可
Linux下的安装,就是将下载的Linux安装包中的go文件夹,解压到/usr/local路径即可
在控制台输入 go version,如果显示了版本号,即代表安装成功
Go环境变量的配置
安装成功后,环境变量的配置也没有以前那么麻烦
仅需要几步操作即可
1、设置GOPATH路径(GOPATH路径是我们的工作区)
go env -w GOPATH=我们自己的工作区路径
例如我的就设为 /Volumes/work/golang/theFirst/
2、什么都别管,先打开GoMOD,再配置代理
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
3、重要的环境变量
Go 通过环境变量来做项目上的管理和控制,通过命令 go env 可以查看相关变量:
go env
set GO111MODULE=on
set GOPATH=E:\go
set GOPROXY=https://goproxy.cn,direct
set GOROOT=D:\install\Go
set GOSUMDB=sum.golang.org
关键环境变量:
GOROOT : Go 的安装目录,即可执行文件所在的目录;
GOPATH :工作目录并不是项目所有目录,编译后的二进制文件存放地, import 包的搜索路径,主要包含 bin 、 pkg 、 src ;
GO111MODULE :启用 go module 管理项目,需要有 go.mod 和 go.sum 文件;
GOPROXY :下载依赖时的代理,必须配置,不然无法成功下载;
常用的代理有:
# 1. 七牛 CDN
export GOPROXY=https://goproxy.cn,direct
# 2. 阿里云
export GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
# 3. 官方
export GOPROXY=https://goproxy.io,direct
初始化项目
GO项目目录解释
src存放源代码
pkg编译后生成的文件
bin编译后生成的可执行文件
新建go项目目录,并在项目的src目录中创建hello目录
# 创建project的目录
$ mkdir gproject
# 进入目录
$ cd gproject/
# 初始化
go mod init gproject
go: creating new go.mod: module gproject
在该目录中创建一个main.go文件:
package main // 声明 main 包,表明当前是一个可执行程序
import "fmt" // 导入内置 fmt 包
func main(){ // main函数,是程序执行的入口
fmt.Println("Hello World!") // 在终端打印 Hello World!
}
执行或编译后执行:
# 直接run
$ go run main.go
# 编译成二进制文件
$ go build
# 执行二进制文件
执行或编译后执行:
# 直接run
$ go run main.go
# 编译成二进制文件
$ go build
# 执行二进制文件
go install#
go install表示安装的意思,它先编译源代码得到可执行文件,然后将可执行文件移动到GOPATH的bin目录下。因为我们的环境变量中配置了GOPATH下的bin目录,所以我们就可以在任意地方直接执行可执行文件了。
跨平台编译#
默认我们go build的可执行文件都是当前操作系统可执行的文件,如果我想在windows下编译一个linux下可执行文件,那需要怎么做呢?
只需要指定目标操作系统的平台和处理器架构即可:
SET CGO_ENABLED=0 // 禁用CGO
SET GOOS=linux // 目标平台是linux
SET GOARCH=amd64 // 目标处理器架构是amd64
使用了cgo的代码是不支持跨平台编译的
然后再执行go build命令,得到的就是能够在Linux平台运行的可执行文件了。
Mac 下编译 Linux 和 Windows平台 64位 可执行程序:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Linux 下编译 Mac 和 Windows 平台64位可执行程序:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Windows下编译Mac平台64位可执行程序:
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build
问题:#
1、$GOPATH/go.mod exists but should not
开启模块支持后,并不能与GOPATH共存,所以把项目从GOPATH中移出即可
2、解决go 生成的exe不在bin文件夹里的问题
解决
控制台执行go install
补充:go install之后没有生成bin目录的原因(环境变量GOBIN)
运行go install HelloWorld,没有报错,但工作空间里也没有生成bin目录。
想起刚才重新配置环境变量时,把GOBIN也给配置了:/usr/local/go/bin。
所以导致install生成的bin并没在当前工作空间生成对应打bin目录,而是把文件直接生成到里/usr/local/go/bin里。
把GOBIN重新置为了默认的空,source之后并没成功。
因为用的LiteIDE,它打环境变量没有更新过来,重启LiteIDE也没好使。
最后把系统注销重新登录了一下好使了
goland使用go mod模式#
第一步:创建空文件夹
第二步:goland以项目方式打开文件夹
第三步:设置goland中的配置,goroot,gomodule
第四步:执行go mod init + 项目名,这个截图的地方多一个go modules,用于存放下载的包的
第五步:创建.go文件,然后写上代码
第六步:执行go mod tidy,下载所需的包,也会删除多余的包
在执行命令go mod tidy时,Go module 会自动整理go.mod 文件
go.mod的内容:
项目名
go 的版本
第三方的包
注意开启go mod 模式后 go get 下载的包都在 go/pkg 目录下
将自动下载依赖包并解压,go get 总是获取最新版本的包
如果包的版本更新了,go get 命令将自动修改go.mod文件
go.sum 该文件记录了所依赖包的hash值,确保依赖包没有被篡改
注意:
经go get 修改的go.mod和go.sum都需要提交的代码库,
这样别人获取项目代码并编译时 就会使用项目所要求的以来版本。
本地保存使用包,命令
go mod vendor
执行该命令后,会出现一个vendor文件夹,里面就是你引用的所有包,由此就可以看出,使用mod后,已经不用依赖于原始的gopath,灵活性更高了。
如果使用过程中有包的变动等,可以使用其他命令辅助,比如go mod tidy,整理你的包目录。
go mod 的指令
go.mod文件中通过指令声明module信息,用于控制命令行工具进行版本选择。一共有四个指令可供使用:
module: 声明module名称;
require: 声明依赖以及其版本号;
replace: 替换require中声明的依赖,使用另外的依赖及其版本号;
exclude: 禁用指定的依赖;
go.sum 文件
引入原由:
为了确保一致性构建,Go引入了go.mod文件来标记每个依赖包的版本,在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地,以便下次构建。
考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod文件并不能保证一致性构建
为了解决Go module的这一安全隐患,Go开发团队在引入go.mod的同时也引入了go.sum文件,用于记录每个依赖包的哈希值,在构建时,如果本地的依赖包hash值与go.sum文件中记录得不一致,则会拒绝构建。
vscode 配置go环境#
Go的安装#
推荐Go官网安装,也可以在Go中文网下载。
可以一直默认,也可以根据自己放到想要的路径。
VSCodede的安装#
推荐VSCode官网下载,下载地址。
安装步骤也是一路next,路径选择根据个人。
配置Go mod镜像#
1、开启gomod,再配置代理
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
通过命令 go env 可以查看相关变量
常用的代理有:
# 1. 七牛 CDN
export GOPROXY=https://goproxy.cn,direct
# 2. 阿里云
export GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
# 3. 官方
export GOPROXY=https://goproxy.io,direct
VSCode的配置
1.下载Go插件
然后点击右边的Install即可(我的是已经安装过的所以这样显示)
- 创建一个项目(文件夹)然后打开他(左上角的File -> Open Folder)
-
然后点击下方的TERMINAL,输入命令go mod init 你的项目名称,执行该命令后,执行的目录下面就会出现一个go.mod文件
-
新建一个Go文件, VSCode会激活Go插件,提示的工具全部安装就行了
-
然后继续在TERMINAL中手动执行go文件,输入指令go run 文件名
go run main.go
一些踩坑经验#
当你开启了GO111MODULE,仍然使用GOPATH模式的方法,在引入自定义模块时会报错。
GO111MODULE 有三个值:off, on和auto(默认值)。
GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
当前目录在GOPATH/src之外且该目录包含go.mod文件
当前文件在包含go.mod文件的目录下面。
当modules 功能启用时,依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的 module。
(1)使用了相对路径:import “./models”
报错:build command-line-arguments: cannot find module for path /D/dev这里后面一堆本地路径
这是因为在go module下 你源码中 impot …/ 这样的引入形式不支持了, 应该改成 impot 模块名/ 。 这样就ok了
(2)使用结合了GOPATH的形式:import “Go-Player/src/ademo/models”
于是我们把上面的import改成了结合GOPATH的如上形式
报错:package Go-Player/src/ademo/models is not in GOROOT development/go/src/GPlayer/src/ademo/models
(3)彻底解决方法:用go env -u 恢复初始设置
不再使用go mod:
go env -w GO111MODULE=off 或者 go env -w GO111MODULE=auto
go env -u GO111MODULE
区别在于,如果GO111MODULE=on或者auto,在go get下载包时候,会下载到GOPATH/pkg/mod,引入时也是同样的从这个目录开始。如果这行了上述命令,那么在go get下载包时候,会下载到GOPATH/src 目录下。