Go快速开发指南
💡 由于工作和未来大数据发展需要,需要对Go语言进行一定学习与使用,特此记录。本系列不会说太多文字概念,重在业务实践和相关开发技巧的总结,和错误的排查记录。因此,如有片面或不足之处,请多海涵且欢迎指正!
一、Go的简简简简单介绍
1.1 Go语言_为并发而生
go语言(全称 Golang)是一个Google开发且 开源 编程语言,诞生于2006年,于2009年11月开源,2012年发布稳定版。
主要特征及优点:
- 自带gc,资源对象自动立即回收。
- 静态编译,编译好后生成exe,扔服务器直接运行。
- 语法层支持并发,支持匿名函数和闭包。
- 简单的思想,没有继承,多态,类等概念,支持函数多返回值。
- 简洁的语法,提高开发效率,同时提高代码可维护性。
- 简单的交叉编译,仅需更改环境变量。
总之,感觉就是 Go语言简单易学!!!
1.2 Go的并发特性
Go语言在多核并发上拥有原生的设计优势,因为Go语言从底层设计时就原生支持并发,无须引入第三方库、无需深厚的开发者的编程技巧和开发经验,就可以实现高性能的开发需求。
Go语言的并发是基于 goroutine 的。
goroutine 类似于线程,但又并非线程。可以将 goroutine 理解为一种虚拟线程。【Go 语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用CPU性能。开启一个goroutine的消耗非常小(大约2KB的内存),你可以轻松创建数百万个goroutine】
1.3 Go与其他语言
Go,主要目标是“兼具Python 等动态语言的开发速度和C/C++等编译型语言的性能与安全性”。
借鉴一张语言开发效率图,如下所示:
可以看出,Go 语言的风格类似于C语言,但进行了大幅的简化,使得Go实现了开发效率与执行效率的完美结合,让你像 “ 写Python代码(效率)一样的方式实现C代码(性能)”。
总之,目前很多大互联网公司,热衷使用 Go 语言来改造旧系统,经过 Go 重构的系统往往可以使用更少的硬件资源,却获得更高的并发和I/O吞吐表现。
二、安装Go语言
GO的安装,跟版本有一定的关系,这里单独介绍,是因为不少博文还是旧的方式导致很多新手小伙伴懵圈。。。。
2.1 Go不同版下载
安装包下载地址:https://go.dev/dl/ 或者 https://golang.google.cn/dl/ 。
Windows 下可以使用 .msi 后缀 或者.zip后缀的安装包来安装。
根据格式不同,
- 下载zip的就解压,存放到某盘路径(需手动配置环境变量)。
- 下载msi的就点击安装(自动配置环境变量),一步步继续即可。
不过呢,.msi文件默认会安装在 c:\Go 目录下,.zip则是一开始就自定义目录。(我这里下载的是.zip安装包)。
具体安装过程这里就跳过了,当go安装后的源文件目录结构有很多。
2.2 不同Go版的配置
【好吧,这里顺带提一嘴,关于go环境变量的配置,看到很多博文没有特意说清楚,两个常见的东西 GoPATH 和 GOROOT,导致很多刚入门的小伙伴懵了逼。】
安装完go以后,需要对go进行一定的配置,此时,需要根据不同的go版本做不同的配置。(根据你自己的版本选看~)
2.2.1 Go 版本:1.11之前
使用go path模式管理项目环境依赖。
这个版本的go,安装后,需要配置系统变量GOPATH,再任意路径下新建一个项目文件夹,再建bin、pkg、src三个目录。
(比如你下载的是go 1.11之前版本,且是zip安装包进行安装的,还需要配置环境变量GOPATH,.msi的自动配置了)。
1.配置GOPATH
GOPATH 是用来指向你以后的go项目的存放路径,你可以自定义任意盘符。
依次打开我的电脑->属性->高级系统设置。
(通常GOPATH路径最好只设置一个,以后的项目代码都放到GOPATH的src目录下)。
同时在path里面添加go的安装目录和刚配置的 GOPATH 目录。
2.新建工作空间
在刚刚自定义的Go项目路径下,手动创建几个文件夹(注意:不是在安装GO的那个文件夹下)。
这三个文件夹,具体用处是:
- bin:存放编译后可执行的文件。
- pkg:存放编译后的应用包。
- src:存放应用源代码。
你会发现go的源文件目录下也同样自带了这三个文件。
为什么要这么做呢?
这是因为,在早期版本的GO语言中,一个Go工程中主要包含这三个目录。
在进行Go语言开发时,源代码会保存在$GOPATH/src目录下,
而产生的二进制可执行文件放在 $GOPATH/bin 目录下,
而生成的中间缓存文件会被保存在 $GOPATH/pkg 目录下。
当然,这是旧版的方式!!!现在都用 go mod 模式了!不需要在建立这种目录结构。
2.2.2 Go 版本:1.12之后
这个版本后,不再使用go path模式,而是开始使用go mod模式来管理依赖环境。
1.配置goproxy
国内访问不到默认的GOPROXY配置链接,所以我们需要换一个PROXY,大多数使用 https://goproxy.io 或 https://goproxy.cn。
终端中输入设置命令即可:
go env -w GOPROXY=https://goproxy.cn,direct
2.设置Go mod
要启用go module支持,首先要设置环境变量GO111MODULE,通过它可以开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是auto。
- off:表示禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。
- on:表示启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。
- auto:表示当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。
通过如下命令查看当前位于什么模式?
> go env
set GO111MODULE=off
set GOMODCACHE=D:\zoutao_code\go_project\pkg\mod
set GOOS=windows
set GOPATH=D:\zoutao_code\go_project
set GOPROXY=https://proxy.golang.com.cn,direct
set GOROOT=D:\zoutao_job\go1.20.2
通过以下命令修改:
go env -w GO111MODULE=on
以此,开启go mod模式。
建议使用go之前,应明确设置该配置项值为 off 或者 on,使用auto会随着版本不同,效果不同,不推荐使用。
题外话,当使用go module模式新建项目时,我们往往需要通过命令:
go mod init 项目名
来对项目进行初始化,该命令会在项目根目录下 生成一个go.mod文件。
(比如,我们使用hello作为我们第一个Go项目的名称,执行命令:go mod init hello)
运行之前还可以使用 go mod tidy 命令将所需依赖添加到go.mod文件中,并且能去掉项目中不需要的依赖了。
2.3 配置后测试
不管你是什么Go版本,相信经过上诉的安装后,你的机器上已经有了一个go环境了。
1.检查版本环境。
此时,任意位置打开一个cmd窗口,使用命令 go version ,应输出版本信息。
可见,本次案例中,我当前使用的是Go 版本:1.20.2。
2.创建go项目测试
任意盘符创建一个工作目录go_demo,其中再创建一个文件名: test.go,内容如下:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!-zou")
}
如图:
然后就可以使用go命令执行了:
E:\go_demo> go run test.go
Hello, World!-zou
自此,go环境与go单体项目测试完毕 ~~~
三、Go的两种模式
上面我们提及了安装不同配置,实际上,两种模式会影响Go项目中代码组织 。
很多文章乃至以后的go开发中,可能会在go代码中,import某些本项目下的模块对象,但启动go项目时,会提示错误如下:
可以看到,存在两条查找记录,一个来自于from $GOROOT,一个是from $GOPATH。
使用命令,查看go的环境变量,可以看到几个关键概念。
> go env
set GO111MODULE=off
set GOMODCACHE=D:\zoutao_code\go_project\pkg\mod
set GOOS=windows
set GOPATH=D:\zoutao_code\go_project
set GOPROXY=https://proxy.golang.com.cn,direct
set GOROOT=D:\zoutao_job\go1.20.2
简单解释:
-
GOPATH:指向的是我们当前go项目的工作目录。我们把它配置成了一个环境变量。(早期是建议只设置一个GOPATH路径,所有的项目代码都放到其src目录下,现在不用,你往下看)。
-
GOROOT:指向的是我们的go语言安装路径。
所以,通常不必设置 $GOROOT,安装go时自动生成,然后就是你可以根据需要,来决定设不设置GOPATH。
那么为什么会存在两条查找记录呢???——项目使用了GO PATH模式。
3.1 go项目模式对比
我们说上面出现两的地方的依赖查找记录,是因为开启了go path模式。
GOPATH 模式
是通过配置环境变量 GO111MODULE=off 来强制开启的。【Go1.11后废弃】
其中特性:
- 不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
- GOPATH 默认为本地电脑的go的安装目录。
- 使用go get下载的包是存放在$GOPATH/src目录中。
- 利用GOPATH,可以实现依赖包存放在一个目录, 自己项目的包存放在另外一个目录
- 没有模块相关的概念。
- 使用GOPATH 时,Go会在以下为目录中搜索包:GOROOT/src(是Go标准库),GOPATH/src(是应用自身代码和第三方依赖的代码)。
【所以上面的报错信息中,出现两行查找。】
GOMOD 模式
是通过配置环境变量 GO111MODULE=on 来强制开启的。【官方推荐】
其中特性:
- 新版中,Go使用GOMODULE来管理程序文件。
- 在使用模块的时候,GOPATH 是无意义的。
- 模块路径需要在模块目录下的 go.mod 文件中使用module指令指定。
- go命令行会使用modules,而一点也不会去GOPATH目录下查找。
- 使用go get下载的包存放在$GOPATH/pkg/mod下的相关目录中。
- 有模块相关的概念及配置, 比如: GOPROXY, GOPRIVATE, GOSUMDB等。
- 新版Modules和传统的GOPATH管理不同,不再需要创建包含例如src,bin这样的子目录,一个源代码目录甚至是空目录都可以,只要其中有go.mod文件。
所以,我们可以使用命令 go env 查看环境。
-
如果要用 go path 模式,则代码中import 引入包,需从src目录下开始引入,且要关闭 关闭 go mod 模式。
-
如果使用 go mod 模式,需在目录下执行 go mod init,目录下产生两个文件go.mod 和 go.sum,否则就会报 "xxxx is not in GOROOT " 的错误。
3.2 包(package)和模块(module)
在go的项目中,你可能会接触到这两个概念。
-
包(package) ,是用来管理 .go 文件的, 有包目录, 包名, 包路径/包导入路径/导入路径等,它是源代码的集合。
-
模块(module) ,是用来管理包的, 有模块目录, 模块路径等,它是包的集合, 一个目录最多只能有一个模块, 一个模块目录里必须要有go.mod文件。
总结: go mod 模式中只保留了部分的 vendor 特性支持,建议日常开发中使用,可用作依赖存档或 CI/CD 使用。
而go path 模式基本废弃,不建议再使用,如果有老项目仍在使用,建议迁移到 go mod 模式。
四、Go的开发工具
go语言叫Golang,go的一款编辑器叫GoLand。(作为一个附加章节,提前说一下。)
4.1 GoLand 编辑器
直接搜索安装,收费的,破解就是。
GoLand 是 JetBrains 公司推出的 Go 语言集成开发环境编辑器(跟IDEA类似),与 WebStorm、PhpStorm、PyCharm 是一家,同样支持 Windows、Linux、macOS 等操作系统。
下载地址:https://www.jetbrains.com/go/
● Go语言:https://golang.org/
● Go语言中文网:https://studygolang.com/
● Go语言包管理:https://gopm.io/
4.2 VsCode Go插件
使用vs-code编辑器也可以,前端小伙伴直接使用vs-code装go插件好了。
vsCode Go插件它是通过一系列go的小工具来完成ide的相关功能,比如智能提示,括号匹配,代码段之类的语言功能。
安装步骤:
- 先从vscode的扩展管理中安装Go插件,直接搜索go。
- 然后安装Go插件所依赖的go tools工具。这个需要编辑器里按ctrl+shift+p 调出命令面板,输入go install tools 选Go: Install/Update Tools。
不出意外,安装go tools这个阶段可能会失败,原因是有墙。
3个解决方法。
- ● 方法1:开国外vpn或代理,让它安装成功,速度不好说。
- ● 方法2:设置go proxy 国内代理源。
- ●方法3:下载别人打包好的tool工具包,解压到自己的go安装bin路径去。
我选用了方法2。
> go env -w GOPROXY=https://goproxy.cn 或 https://goproxy.io/zh/
> go clean --modcache
然后在下载tool工具即可。
4.3 IDEA Go插件
后来用不惯vscode,又不想再安装一个goland,于是用IDEA尝试安装GO插件来开发go的项目。
具体步骤:
1.idea安装go插件
打开IDEA,依次 File-》settings-》Plugins-》搜索go,然后install,重启。然后二次点开 File->settings,在 Languages&Frameworks 中可看到Go的选项了。
2.idea配置go环境
有很多博客说,要配置GOROOT和GOPATH,这里严重说明,新版go采用go mod 管理,不能与go path模式共存,根本不需要配置GOPATH,只需要配置一个GOROOT即可。
否则你会发现,你的项目启动时会提示$GOPATH/go.mod exists but should not错误。
最终,以后你不管是新建go项目,还是导入打开一个go项目,只需要确保如下:project gopath,和下面的module gopath 两栏都是空的即可。
4.4 IDEA调试GO失效
使用idea对go项目,点run运行没有问题,当点debug调试时,会发现无法正常进入断点,总跳到一些莫名的底层文件里去或报错 Version of Delve is too old 。
检查Delve版本
若Delve版本和当前的golang版本不匹配,则需要更新Delve到与go相同版本。
$ dlv
Delve is a source level debugger for Go programs. //Delve是Go程序的源代码级调试器。
$ dlv version
Delve Debugger
Version: 1.20.2
Build: $Id: e0c278ad8e0126a312b553b8e171e81bcbd37f60
$ go version
go version go1.20.2 windows/amd64
我的delve和Go语言版本一致,无需更新?
这一次我的IDEA,启动go项目,开头报错:WARNING: undefined behavior - version of Delve is too old for Go version 1.20.2 (maximum supported version 1.19)
如图:
为啥查询到的是相同版本,这里却提示不是呢?只能也安装一次新版的delve了。最后我也重新下载编译了新dlv且在IDEA中指定了其exe的路径。
手动更新Delve版本:
- 1.找到仓库。https://github.com/go-delve/delve。
- 2.把仓库克隆到本地:git clone https://github.com/go-delve/delve.git。
- 3.Doc窗口,进入到cmd/dlv目录,运行 go build, 会生成一个dlv.exe文件。
- 4.将dlv.exe放到go的安装路径$GOPATH的bin中,比如这里是:D:/zoutao_job/go1.20.2/bin/dlv.exe。
- 5.打开IDEA -> help -> Edit Custom Properties, 输入 dlv.path=D:/zoutao_job/go1.20.2/bin/dlv.exe。
- 6.重启IDEA,再次以调试启动项目即可。
如图:
打开IDEA的 Edit Custom Properties, 输入指定目录:
指定delve.exe 1.20.2后,go项目就可以正常debug了!
本文到此结束~~~