go快速开发入门指南(一)

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快速开发入门指南(一)_第1张图片
可以看出,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后缀的安装包来安装。
go安装包

根据格式不同,

  • 下载zip的就解压,存放到某盘路径(需手动配置环境变量)。
  • 下载msi的就点击安装(自动配置环境变量),一步步继续即可。

不过呢,.msi文件默认会安装在 c:\Go 目录下,.zip则是一开始就自定义目录。(我这里下载的是.zip安装包)。

具体安装过程这里就跳过了,当go安装后的源文件目录结构有很多。
go快速开发入门指南(一)_第2张图片

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项目的存放路径,你可以自定义任意盘符。

依次打开我的电脑->属性->高级系统设置。
go快速开发入门指南(一)_第3张图片
(通常GOPATH路径最好只设置一个,以后的项目代码都放到GOPATH的src目录下)。

同时在path里面添加go的安装目录和刚配置的 GOPATH 目录。
在这里插入图片描述

2.新建工作空间

在刚刚自定义的Go项目路径下,手动创建几个文件夹(注意:不是在安装GO的那个文件夹下)。
go快速开发入门指南(一)_第4张图片
这三个文件夹,具体用处是:

  • 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快速开发入门指南(一)_第5张图片

然后就可以使用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的相关功能,比如智能提示,括号匹配,代码段之类的语言功能。

go快速开发入门指南(一)_第6张图片

安装步骤:

  • 先从vscode的扩展管理中安装Go插件,直接搜索go。
  • 然后安装Go插件所依赖的go tools工具。这个需要编辑器里按ctrl+shift+p 调出命令面板,输入go install tools 选Go: Install/Update Tools。

不出意外,安装go tools这个阶段可能会失败,原因是有墙。

3个解决方法。

  • ● 方法1:开国外或代理,让它安装成功,速度不好说。
  • ● 方法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的选项了。

go快速开发入门指南(一)_第7张图片

2.idea配置go环境

有很多博客说,要配置GOROOT和GOPATH,这里严重说明,新版go采用go mod 管理,不能与go path模式共存,根本不需要配置GOPATH,只需要配置一个GOROOT即可。

否则你会发现,你的项目启动时会提示$GOPATH/go.mod exists but should not错误。

go快速开发入门指南(一)_第8张图片

最终,以后你不管是新建go项目,还是导入打开一个go项目,只需要确保如下:project gopath,和下面的module gopath 两栏都是空的即可。

go快速开发入门指南(一)_第9张图片

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)

如图:

go快速开发入门指南(一)_第10张图片
为啥查询到的是相同版本,这里却提示不是呢?只能也安装一次新版的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,再次以调试启动项目即可。

如图:

go快速开发入门指南(一)_第11张图片

打开IDEA的 Edit Custom Properties, 输入指定目录:

go快速开发入门指南(一)_第12张图片

指定delve.exe 1.20.2后,go项目就可以正常debug了!

go快速开发入门指南(一)_第13张图片


本文到此结束~~~

你可能感兴趣的:(go语言系列,golang,java,大数据,go)