搭建go环境和初始化项目

转:https://www.cnblogs.com/caibaotimes/p/14780816.html

Go的安装

补充说明:由于VS Code对go mod模式的支持暂时还不够完善,建议大家使用Goland编辑器。

安装基本还是之前的老样子,不过现在的安装早已省事不少,不再需要配置环境变量。直接去官网,下载了安装包后直接安装即可

在Go中文网进行Go最新版安装包的下载(或者复制网址浏览器打开https://studygolang.com/dl)

不管是Windows还是MacOS都是非常简单快捷,将安装包下载好后直接一步到位next即可

Linux下的安装,就是将下载的Linux安装包中的go文件夹,解压到/usr/local路径即可

在控制台输入go version,如果显示了版本号,即代表安装成功

Go环境变量的配置

安装成功后,环境变量的配置也没有以前那么麻烦

仅需要几步操作即可

1、设置GOPATH路径(GOPATH路径是我们的工作区)

Copy go env -w GOPATH=我们自己的工作区路径

例如我的就设为 /Users/naonao/go

2、什么都别管,先打开GoMOD,再配置代理

在这里感谢「七牛云」为我们中国区的Golang开发者提供的代理服务

Copy $ go env -w GO111MODULE=on 
$ go env -w GOPROXY=https://goproxy.cn,direct

3、重要的环境变量

Go 通过环境变量来做项目上的管理和控制,通过命令 go env 可以查看相关变量:

Copy C:\Users\user>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

关键环境变量:

GOROOTGo 的安装目录,即可执行文件所在的目录;

GOPATH工作目录并不是项目所有目录,编译后的二进制文件存放地import 包的搜索路径,主要包含 binpkgsrc

GO111MODULE :启用 go module 管理项目,需要有 go.modgo.sum 文件;

GOPROXY下载依赖时的代理,必须配置,不然无法成功下载;

常用的代理有:

Copy # 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目录

Copy # 创建project的目录
$ mkdir gproject

# 进入目录
$ cd gproject/

# 初始化
E:\go>go mod init gproject
go: creating new go.mod: module gproject

在该目录中创建一个main.go文件:

Copy package main  // 声明 main 包,表明当前是一个可执行程序

import "fmt"  // 导入内置 fmt 包

func main(){  // main函数,是程序执行的入口
	fmt.Println("Hello World!")  // 在终端打印 Hello World!
}

执行或编译后执行:

Copy # 直接run
$ go run main.go 

 
# 编译成二进制文件
$ go build

# 执行二进制文件

go install

go install表示安装的意思,它先编译源代码得到可执行文件,然后将可执行文件移动到GOPATH的bin目录下。因为我们的环境变量中配置了GOPATH下的bin目录,所以我们就可以在任意地方直接执行可执行文件了。

跨平台编译

默认我们go build的可执行文件都是当前操作系统可执行的文件,如果我想在windows下编译一个linux下可执行文件,那需要怎么做呢?

只需要指定目标操作系统的平台和处理器架构即可:

Copy SET CGO_ENABLED=0  // 禁用CGO
SET GOOS=linux  // 目标平台是linux
SET GOARCH=amd64  // 目标处理器架构是amd64

使用了cgo的代码是不支持跨平台编译的

然后再执行go build命令,得到的就是能够在Linux平台运行的可执行文件了。

Mac 下编译 Linux 和 Windows平台 64位 可执行程序:

Copy CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Linux 下编译 Mac 和 Windows 平台64位可执行程序:

Copy CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Windows下编译Mac平台64位可执行程序:

Copy 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

img

第四步:执行go mod init + 项目名,这个截图的地方多一个go modules,用于存放下载的包的

img

第五步:创建.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都需要提交的代码库,
这样别人获取项目代码并编译时 就会使用项目所要求的以来版本。

本地保存使用包,命令

Copy go mod vendor

执行该命令后,会出现一个vendor文件夹,里面就是你引用的所有包,由此就可以看出,使用mod后,已经不用依赖于原始的gopath,灵活性更高了。

如果使用过程中有包的变动等,可以使用其他命令辅助,比如go mod tidy,整理你的包目录。

go mod 的指令

go.mod文件中通过指令声明module信息,用于控制命令行工具进行版本选择。一共有四个指令可供使用:

Copy  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,再配置代理

Copy $ 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插件
    img

然后点击右边的Install即可(我的是已经安装过的所以这样显示)

2. 创建一个项目(文件夹)然后打开他(左上角的File -> Open Folder)

img

3. 然后点击下方的TERMINAL,输入命令go mod init 你的项目名称,执行该命令后,执行的目录下面就会出现一个go.mod文件

4. 新建一个Go文件, VSCode会激活Go插件,提示的工具全部安装就行了

5. 然后继续在TERMINAL中手动执行go文件,输入指令go run 文件名

Copy 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 D:/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 目录下

posted @ 2021-12-14 11:47  1769987233  阅读(67)  评论(0编辑  收藏  举报