Hey,我是寅贝勒,大厂后端开发一枚😜,欢迎来我的个人网站 www.ly-zone.cloud 一起学习交流~
一、Go1.19安装
官网下载
版本介绍:
- amd64: 就是X64, X64表示的是CPU指令集类型
- arm64:cpu架构的一种,64位架构
- 386:i386指的是intel80386,32位架构
- X86:32位架构
kind:
- Source:源代码包,需要经过计算机编译才能执行安装
- Archive、Binary:二进制包,已编译好的可直接使用的程序,这里需要解压缩,解压缩后,点击bin目录下的.sh或者.bat执行文件即可使用
- Installer:安装程序,执行exe文件就可以安装
版本如何选择: 打开电脑的设置,查看本机的配置
需要配置三个环境变量:
- 1、GOROOT
- 2、GOPATH
- 3、PATH中配置
%GOROOT%\bin
查看版本
二、环境变量
-
GOROOT
表示Go语言的安装目录
-
GOPATH
用于指定我们的开发工作区(workspace),是存放源代码、测试文件、库静态文件、可执行文件的工作区
-
GOBIN
程序生成的可执行文件的路径,go install
命令编译和打包应用程序时,该命令会将编译后二进制程序打包GOBIN目录,一般我们将GOBIN设置为$GOPATH/bin
目录
-
GOOS
交叉编译,是指在一个平台上就能生成可以在另一个平台上运行的代码,可以帮助我们在32位的Windows操作系统开发环境上,生成可以在64位Linux操作系统上运行的二进制程序,其中GOOS默认的是我们当前的操作系统
-
GOARCH
表示CPU架构,如386、amd64、arm等
-
GO111MODULE
控制是否使用go mod
,GO111MODULE 有三个值:off, on和auto(默认值)
-
GOMODCACHE
模块缓存是 go 命令存储下载模块文件的目录,默认模块位置是 $GOPATH/pkg/mod
-
GOPROXY
在安装和更新某些包时,因为国内访问不到,需要配置代理
GOPROXY.IO
-
GOSUMDB
可以用来配置你使用哪个校验服务器和公钥来做依赖包的校验,默认值是sum.golang.org
go.sum工作机制:
为了确保一致性构建,Go引入了go.mod文件来标记每个依赖包的版本,在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地,以便下次构建。 考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod文件并不能保证一致性构建。
为了解决Go module的这一安全隐患,Go开发团队在引入go.mod的同时也引入了go.sum文件,用于记录每个依赖包的哈希值,在构建时,如果本地的依赖包hash值与go.sum文件中记录得不一致,则会拒绝构建
三、目录结构
其中:
api:用于存放依照 Go 版本顺序的 API 增量列表文件。这里所说的 API 包含公开的变量,常量,函数等
- except.txt:列举了接下来可能会废弃的API,但是并不影响兼容问题
- go*.txt:每个版本的API列表,文件内容只增不减,版本发布后就归档不再改动
- README:说明文件,里面有对该目录下文件作用的说明
bin:存放go语言所需要的编译后的可执行文件
doc:用于存放标准库的 HTML 格式的程序文档
lib:库文档模板,里面列举了time包的说明
misc:用于存放一些辅助类的说明和工具,辅助查看和编辑Go代码,很杂
pkg:用于存放安装 Go 标准库的所有归档文件
用于存放通过 go install 命令安装后的代码包的归档文件。前提是代码包中必需包含 Go 库源码文件。归档文件是指那些名称以 .a 结尾的文件。
该目录与 GOROOT 目录下的 pkg 目录功能类似。区别在于,工作区中的 pkg 目录专门用来存放用户代码的归档文件。
编译和安装用户代码的过程一般会以代码包为单位进行。比如 log 包被编译安装后,将生成一个名为 log.a 的归档文件,并存放在当前工作区的 pkg 目录下的平台相关目录中。
.a
文件属于静态链接库文件,是某一个代码包中的程序。Go 语言的链接器可以把相关的静态库链接在一起,从而生成最终的可执行文件。 在 Go 语言对可执行程序进行安装的时候,会把相关的静态链接库与之打包在一起。所以生成的可执行文件才可以独立运行的,这也是很明显的优势
src:用于存放 Go 本身,Go 标准工具以及标准库的所有源码文件
- archive:归档文件处理库,可以用来处理tar与zip类型文件
- bufio:主要用于文本的读取写入,对io.Reader和io.Writer进行了实现和封装,提供了比较便利的方法操作文件
- builtin:定义了常用了内置类型、函数和接口,比如make、new、len、error等
- bytes:定义了用来操作字节的函数
- cmd:提供了Go语言的基本工具,比如我们常用的代码格式化工具gofmt、静态检查工具vet等
src中的cmd所提供的工具如下:
- addr2line:因为linux上才支持这个命令,所以这里做了一个模拟器,用来支持pprof的
- api:用于生成Go语言API列表,也就是上面提到的api目录下的go*.txt文件
- asm:汇编器,将源文件汇编为目标文件
- buildid:用来更新库或二进制文件中构建的标识
- cgo:支持创建调用C代码的包
- compile:编译工具
- cover:用来分析单元测试覆盖率的工具
- dist:是一个引导程序,负责构建Go语言的其他工具
- doc:用于提取并生成Go程序文档
- fix:用来找到使用旧API的程序,然后更新为新的API
- go:我们经常用的go命令,管理源代码工具
- gofmt:代码格式化工具
- inernal:一些内部通用实现,被其他包调用
- link:连接器
- nm:列出了由目标文件,归档文件或可执行文件定义或使用的符号
- objdump:将 Go 的二进制文件反编译成汇编代码,同时可以打印出 Go 源码
- pack:备份压缩工具,是unix系统中ar工具的简单实现,它可以将多个文件打包为一个备存文件
- pprof:Go程序的性能分析工具
- test2json:将Go测试程序的输出转换为机器可读的JSON流
- trace:用来跟踪分析goroutines运行调度状态等功能的工具,比pprof更加细粒度
- vendor:Go语言包依赖工具
- vet:代码静态检查工具
- compress:压缩、解压工具,支持bzip2、flate、gzip、lzw、zlib等格式
- container:提供了双向链表(list)、堆(heap)、环形联表(ring)的数据结构的操作
- context:通常在goroutine切换执行时,需要知道相关状态信息才能执行,而这些信息就被封装在context中,它的使用在Go语言中十分广泛
- crypto:封装了很多加解密算法,比如rsa、sha1、aes、md5等函数
- database:提供了各种数据库的通用API,比如SQLite、MySQL、Postgres
- debug:支持Go程序调试
- embed:可以在编译阶段将静态资源文件打包进编译好的程序中,并提供访问这些文件的能力
- encoding:封装了各类编码的实现,比如base64、json、xml、hex等
- errors:是我们经常使用的错误函数,也可以自定义
- expvar:提供了一系列标准接口,可以通过HTTP的方式将服务器的变量以JSON格式打印出来
- flag:解析处理命令行参数的工具
- fmt:封装了各种格式化输出方法
- go:封装了go包的命令
- hash:封装了crc32、crc64在内的哈希函数
- html:HTML模板引擎,可以将代码与HTML混合在一起,它会负责解析转义,类似python的jinja、php的smarty等
- image:一般语言都会有的图像处理库
- index:用来实现字符串高速匹配查找
- internal:专门用来控制包导入权限的,以internal命名的包只允许它父级和父级的子级目录导入
- io:为文件I/O提供了一些基本的接口,bufio就对它进行了实现
- log:封装了日志记录方法,比如log.Fatal、log.Print等
- math:封装了基本的数学相关的函数
- plugin:Go1.8版本以后提供的插件机制,可以动态地加载动态链接库文件.so,这样对外发布动态链接库就不需要把源码给到对方进行编译了
- reflect:封装反射读取方法,比如读取结构体的方法、属性等
- regexp:封装了正则表达式的实现
- runtime:包含了Go运行时的操作,这块水很深,这里目前不再展开陈述
- sort:封装了部分排序算法
- strconv:封装了基础类型与字符串互相转换的方法,比如int转string,反之亦然
- strings:封装了字符串操作的相关方法
- sync:封装了基本的同步机制,各种锁的实现
- syscall:封装了一系列系统调用的接口
- testdata:单测数据
- testing:为Go语言测试程序提供支持。
- text:封装了文本处理相关的方法,比如文本扫描或文本标签过滤器等。
- time:封装了时间处理相关的函数,比如获取当前时间,计算时间差等。
- unicode:封装了utf8、utf16的编解码方法。
- unsafe:用于一些不安全的操作场景,比如正常情况下,指向不同类型数据的指针是无法互相转换的,但是就可以用unsafe的Pointer方法来实现,所以应该要谨慎使用。
- vendor:封装Go语言包依赖工具方法
test:存放用来测试和验证Go本身的所有相关文件
codereview.cfg:代码审查的相关配置文件
CONTRIBUTING.md:加入贡献者队列的指导文件
LICENSE:授权协议
PATENTS:专利
README.md:说明文件
SECURITY.md:安全政策
VERSION:版本
参考文章:
http://t.csdn.cn/9bvHg
http://t.csdn.cn/vAC67