Golang环境篇

一、Golang环境篇

一)go简介

1、Golang定义

Go语言是Google于2009年推出的一门新的系统编程语言。

2、特性:
  • 静态编译
  • 内存分配:Go 选择了 tcmalloc,它本就是为并发而设计的高性能内存分配组件。
  • 垃圾回收:每次升级,垃圾回收器必然是核心组件里修改最多的部分。从并发清理,到降低 STW 时间,直到 Go 的 1.5 版本实现并发标记,逐步引入三色标记和写屏障等等,都是为了能让垃圾回收在不影响用户逻辑的情况下更好地工作。尽管有了努力,当前版本的垃圾回收算法也只能说堪用,离好用尚有不少距离。
  • 简洁的符号和语法
  • 平坦的类型系统
  • 基于CSP的并发模型
  • 丰富的标准库
    • 功能完善、质量可靠的标准库为编程语言提供了充足动力。在不借助第三方扩展的情况下,就可完成大部分基础功能开发,这大大降低了学习和使用成本。最关键的是,标准库有升级和修复保障,还能从运行时获得深层次优化的便利,这是第三方库所不具备的。
    • Go 标准库虽称不得完全覆盖,但也算极为丰富。其中值得称道的是 net/http,仅须简单几条语句就能实现一个高性能 Web Server,这从来都是宣传的亮点。更何况大批基于此的优秀第三方 Framework 更是将 Go 推到 Web/Microservice 开发标准之一的位置。
  • 高效简单的工具链
    • 完整的工具链对于日常开发极为重要。Go 在此做得相当不错,无论是编译、格式化、错误检查、帮助文档,还是第三方包下载、更新都有对应的工具。其功能未必完善,但起码算得上简单易用。
    • 内置完整测试框架,其中包括单元测试、性能测试、代码覆盖率、数据竞争,以及用来调优的 pprof,这些都是保障代码能正确而稳定运行的必备利器。
    • 可通过环境变量输出运行时监控信息,尤其是垃圾回收和并发调度跟踪,可进一步帮助我们改进算法,获得更佳的运行期表现。
3、go语言家谱

4、为什么选择go语言(优势)
  • 语法简单,易于学习。类C的语法,同时比C/C++简洁和干净
  • 自带GC,方便使用
  • 编译型语言,运行速度快
  • 静态编译,没有依赖
  • 天生支持并发,充分利用多核(省机器,节约成本)
  • 大厂支持
  • 标准类库,规范统一
并行和并发
  • 并发(concurrent)不是并行(parallel)
复制代码
Go语言正是在多核和网络化的时代背景下诞生的原生支持并发的编程语言。Go语言从底层原生支持并发,无须第三方库,开发人员可以很轻松地在编写程序时决定怎么使用 CPU 资源。

Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程。可以将 goroutine 理解为一种虚拟线程。Go语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用 CPU 性能。

多个 goroutine 中,Go语言使用通道(channel)进行通信,通道是一种内置的数据结构,可以让用户在不同的 goroutine 之间同步发送具有类型的消息。这让编程模型更倾向于在 goroutine 之间发送消息,而不是让多个 goroutine 争夺同一个数据的使用权。

提示:Go语言通过通道可以实现多个 goroutine 之间内存共享。

  • 一个例子:nodejs具有并发的能力,但不能充分利用多核
  • 写出一个能充分利用多核的程序需要很深的系统编程积淀
  • 得益于优秀的设计,go可以轻松地写出跑满所有CPU的程序
5、GO的用途
  • 巨型中央服务器领域
  • 高性能分布式领域
  • 游戏服务端开发
  • 复杂事件处理
  • 对实时性要求很高的软件开发
  • 可以在Intel和ARM处理上运行,因此也可以在安卓上运行

6、Go的性能

流行的语言大都是运行在虚拟机上,如:Java 和 Scala 使用的 JVM,C#VB.NET 使用的 .NET CLR。尽管虚拟机的性能已经有了很大的提升,但任何使用 JIT 编译器和脚本语言解释器的编程语言(Ruby、Python、Perl 和 JavaScript)在 C 和 C++ 的绝对优势下甚至都无法在性能上望其项背

国外的一个编程语言性能测试网站 http://benchmarksgame.alioth.debian.org/ 为测试基准和数据源。这个网站可以对常见的编程语言进行性能比较,网站使用都是最新的语言版本和常见的一些算法。

7、Go标准库强大

在Go语言的安装文件里包含了一些可以直接使用的包,即标准库。Go语言的标准库,提供了清晰的构建模块和公共接口,包含 I/O 操作、文本处理、图像、密码学、网络和分布式应用程序等,并支持许多标准化的文件格式和编解码协议

一般情况下,标准包会存放在 GOROOT/pkg/GOOS_$GOARCH/ 目录下

Go语言的标准库以包的方式提供支持,下表列出了Go语言标准库中常见的包及其功能。

Go语言标准库包名 功 能
bufio 带缓冲的 I/O 操作
bytes 实现字节操作
container 封装堆、列表和环形列表等容器
crypto 加密算法
database 数据库驱动和接口
debug 各种调试文件格式访问及调试功能
encoding 常见算法如 JSON、XML、Base64 等
flag 命令行解析
fmt 格式化操作
go Go语言的词法、语法树、类型等。可通过这个包进行代码信息提取和修改
html HTML 转义及模板系统
image 常见图形格式的访问及生成
io 实现 I/O 原始访问接口及访问封装
math 数学库
net 网络库,支持 Socket、HTTP、邮件、RPC、SMTP 等
os 操作系统平台不依赖平台操作封装
path 兼容各操作系统的路径操作实用函数
plugin Go 1.7 加入的插件系统。支持将代码编译为插件,按需加载
reflect 语言反射支持。可以动态获得代码中的类型信息,获取和修改变量的值
regexp 正则表达式封装
runtime 运行时接口
sort 排序接口
strings 字符串转换、解析及实用函数
time 时间接口
text 文本模板及 Token 词法器

二)安装配置golang

1、Go 语言支持以下系统:

安装包下载地址:https://golang.org/dl/ (若此地址打不开,使用下面的地址)

或官方下载:All releases - The Go Programming Language

  • Linux
  • Mac OS X(也称为 Darwin)
  • Windows
2、Linux安装Go
1)下载安装包

复制代码
cd /usr/local/src
https://golang.google.cn/dl/go1.18.3.linux-amd64.tar.gz
2)安装
复制代码
tar -xvf go1.18.3.linux-amd64.tar.gz -C /usr/local
3)设置环境变量

需要配置 2 个环境变量分别是 GOROOT 和 PATH。

  • GOROOT 的值应该为Go语言的当前安装目录:export GOROOT=/usr/local/go
  • PATH 为了方便使用Go语言命令和 Go 程序的可执行文件,需要追加其值:export PATH=PATH:GOROOT/bin:$GOBIN

把这几个环境变量添加 profile 文件中(~/.bash_profile 或 /etc/profile)。如果是单用户使用,可以将环境变量添加在 home 目录下的 bash_profile 文件中,如果是多用户使用,需要添加在 /etc/profile 文件

复制代码
cat >> /etc/profile <<EOF
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
EOF

source  /etc/profile
4)验证环境
复制代码
go env
3、macOS 安装Go
1)下载安装包

2)安装安装:和安装其他软件一样
3)设置环境变量

开始写 go 项目代码之前,需要我们先配置好环境变量。编辑 ~/.bash_profile(在终端中运行 vi ~/.bash_profile 即可)来添加下面这行代码(如果你找不到 .bash_profile,那自己创建一个就可以了)

GOROOT 也就是 Go 开发包的安装目录默认是在 /usr/local/go,如果没有,可以在 bash_profile 文件中设置。

复制代码
export GOPATH=$HOME/go
export GOROOT=/usr/local/go

source ~/.bash_profile

4)验证环境
复制代码
go env
4、Windows安装Go
1)下载安装包

2)安装:和安装其他软件一样------点点点

目录名 说明
api 每个版本的 api 变更差异
bin go 源码包编译出的编译器(go)、文档工具(godoc)、格式化工具(gofmt)
doc 英文版的 Go 文档
lib 引用的一些库文件
misc 杂项用途的文件,例如 Android 平台的编译、git 的提交钩子等
pkg Windows 平台编译好的中间文件
src 标准库的源码
test 测试用例
[Go 开发包的安装目录的功能及说明]
3)设置环境变量

开发包安装完成后,我们还需要配置一下GOPATH 环境变量,之后才可以使用Go语言进行开发。GOPATH 是一个路径,用来存放开发中需要用到的代码包。

在桌面或者资源管理器右键"此电脑"(或者"我的电脑")→"属性"→"高级系统设置"→"环境变量",如下图所示。

在弹出的菜单里找到 GOPATH 对应的选项点击编辑之后就可以修改了,没有的话可以选择新建,并将变量名填写为 GOPATH,变量值设置为任意目录均可(尽量选择空目录),例如 D:\Go。

提示:填写完成后,每个打开的窗口都需要点击"确定"来保存设置

4)验证环境

其它的环境变量安装包均会进行自动设置。在默认情况下,Go 将会被安装在目录 c:\go 下,但如果你在安装过程中修改安装目录,则可能需要手动修改所有的环境变量的值。

环境变量设置好后,可以通过go env 命令来进行测试

三)Go工程结构和依赖管理

1、Go工程结构

一个Go语言项目的目录一般包含以下三个子目录:

  • src 目录:放置项目和库的源文件;
  • pkg 目录:放置编译后生成的包/库的归档文件;
    • 用于存放通过go install 命令安装某个包后的归档文件。归档文件是指那些名称以".a"结尾的文件。
  • bin 目录:放置编译后生成的可执行文件。
    • 与 pkg 目录类似,在通过go install 命令完成安装后,保存由 Go 命令源文件生成的可执行文件。
2、Go依赖管理

Go所依赖的所有的第三方库都放在GOPATH这个目录下面。这就导致了同一个库只能保存一个版本的代码

  • go module

使用 go module 管理依赖后会在项目根目录下生成两个文件go.mod和go.sum。

复制代码
go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。
  • GOPROXY

Go1.13之后GOPROXY默认值为https://proxy.golang.org,在国内是无法访问的,所以十分建议大家设置GOPROXY,这里我推荐使用goproxy.cn

复制代码
go env -w GOPROXY=https://goproxy.cn,direct

四)go常用命令

1、go help查看帮助信息
复制代码
# go help
Go is a tool for managing Go source code.

Usage:

    go <command> [arguments]

The commands are:

    bug         start a bug report
    build       compile packages and dependencies
    clean       remove object files and cached files
    doc         show documentation for package or symbol
    env         print Go environment information
    fix         update packages to use new APIs
    fmt         gofmt (reformat) package sources
    generate    generate Go files by processing source
    get         add dependencies to current module and install them
    install     compile and install packages and dependencies
    list        list packages or modules
    mod         module maintenance
    run         compile and run Go program
    test        test packages
    tool        run specified go tool
    version     print Go version
    vet         report likely mistakes in packages

Use "go help <command>" for more information about a command.

Additional help topics:

    buildconstraint build constraints
    buildmode       build modes
    c               calling between Go and C
    cache           build and test caching
    environment     environment variables
    filetype        file types
    go.mod          the go.mod file
    gopath          GOPATH environment variable
    gopath-get      legacy GOPATH go get
    goproxy         module proxy protocol
    importpath      import path syntax
    modules         modules, module versions, and more
    module-get      module-aware go get
    module-auth     module authentication using go.sum
    packages        package lists and patterns
    private         configuration for downloading non-public code
    testflag        testing flags
    testfunc        testing functions
    vcs             controlling version control with GOVCS

Use "go help <topic>" for more information about that topic.
2、go build

go build 命令主要是用于测试编译

Windows环境

  • 如果是普通包,当你执行go build命令后,不会产生任何文件
  • 如果是main包,当只执行go build命令后,会在当前目录下生成一个可执行文件。
  • 如果需要在$GOPATH/bin木下生成相应的exe文件,需要执行go install 或者使用 go build -o 路径/a.exe。
3、go clean

go clean 命令是用来移除当前源码包里面编译生成的文件,这些文件包括

复制代码
_obj/ 旧的object目录,由Makefiles遗留
_test/ 旧的test目录,由Makefiles遗留
_testmain.go 旧的gotest文件,由Makefiles遗留
test.out 旧的test记录,由Makefiles遗留
build.out 旧的test记录,由Makefiles遗留
*.[568ao] object文件,由Makefiles遗留
DIR(.exe) 由 go build 产生
DIR.test(.exe) 由 go test -c 产生
MAINFILE(.exe) 由 go build MAINFILE.go产生
4、go fmt

go fmt 命令主要是用来帮你格式化所写好的代码文件。

复制代码
比如我们写了一个格式很糟糕的 test.go 文件,我们只需要使用 fmt go test.go 命令,就可以让go帮我们格式化我们的代码文件。但是我们一般很少使用这个命令,因为我们的开发工具一般都带有保存时自动格式化功能,这个功能底层其实就是调用了 go fmt 命令而已。

使用go fmt命令,更多时候是用gofmt,而且需要参数-w,否则格式化结果不会写入文件。gofmt -w src,可以格式化整个项目。
5、go get

go get 命令主要是用来动态获取远程代码包的,目前支持的有BitBucket、GitHub、Google Code和Launchpad

这个命令在内部实际上分成了两步操作:第一步是下载源码包,第二步是执行go install。下载源码包的go工具会自动根据不同的域名调用不同的源码工具,对应关系如下:

复制代码
BitBucket (Mercurial Git)
GitHub (Git)
Google Code Project Hosting (Git, Mercurial, Subversion)
Launchpad (Bazaar)

为了go get 能正常工作,你必须确保安装了合适的源码管理工具,并同时把这些命令加入你的PATH中。其实go get支持自定义域名的功能,具体参见go help remote。

go get 命令本质上可以理解为:首先通过源码工具clone代码到src目录,然后执行go install。

6、go install

go install 命令在内部实际上分成了两步操作

  • 第一步是生成结果文件(可执行文件或者.a包)
  • 第二步会把编译好的结果移到 G O P A T H / p k g 或 者 GOPATH/pkg 或者GOPATH/pkg或者GOPATH/bin
复制代码
.exe文件: 一般是 go install 带main函数的go文件产生的,有函数入口,所有可以直接运行。

.a应用包: 一般是 go install 不包含main函数的go文件产生的,没有函数入口,只能被调用。
7、go test

go test 命令,会自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件。输出的信息类似

复制代码
ok archive/tar 0.011s FAIL archive/zip 0.022s ok compress/gzip

0.033s …

默认的情况下,不需要任何的参数,它会自动把你源码包下面所有test文件测试完毕,当然你也可以带上参数,详情请参考go help testflag

8、go doc

go doc 命令其实就是一个很强大的文档工具。

复制代码
如何查看相应package的文档呢? 
安装包:go get golang.org/x/tools/cmd/doc


例如builtin包,那么执行go doc builtin;如果是http包,那么执行go doc net/http;
查看某一个包里面的函数,那么执行godoc fmt Printf;也可以查看相应的代码,执行godoc -src fmt Printf;

通过命令在命令行执行 godoc -http=:端口号 比如godoc -http=:8080。然后在浏览器中打开127.0.0.1:8080,你将会看到一个golang.org的本地copy版本,通过它你可以查询pkg文档等其它内容。
如果你设置了GOPATH,在pkg分类下,不但会列出标准包的文档,还会列出你本地GOPATH中所有项目的相关文档,这对于经常被限制访问的用户来说是一个不错的选择。
9、go mod

module相关命令

复制代码
新建一个go mod 的项目
go mod init module_name
复制代码
增加缺少的module,删除无用的module:通过扫描当前项目中的所有代码来添加为被记录的依赖至go.mod文件中或从go.mod文件中删除不再被使用的依赖
复制代码
go mod tidy 
复制代码
go mod edit 编辑go.mod文件
go mod graph 打印模块依赖图
go mod vendor 将依赖复制到vendor下
go mod verify 校验依赖
go mod why 解释为什么需要依赖
10、其他命令
复制代码
go fix 用来修复以前老版本的代码到新版本,例如go1之前老版本的代码转化到go1
go version 查看go当前的版本
go env 查看当前go的环境变量
go list 列出当前全部安装的package
go run 编译并运行Go程序
11、常用命令
复制代码
# 获取main中包的地址 和 go的版本信息,并写入go.mod文件中
go mod init

# 下载安装 go.mod中的包(包含依赖包)
go mod tidy

# 运行main.go 
go run main.go

五)go集成开发环境IDE

1、VSCode免费

VSCode中文网 - Visual Studio Code中文官网 VS Code编辑器中文网站

2、goland收费

GoLand

六)go 配置国内仓库

1、Linux操作系统

配置环境变量:修改profile或bashrc

复制代码
export GOPROXY=https://goproxy.baidu.com/

# 也可使用: http://goproxy.cn
2、goland编辑器

Settings ->Language & Frameworks Go -> Go Modules

相关推荐
IT技术分享社区26 分钟前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
极客代码29 分钟前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
疯一样的码农35 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
疯狂的程需猿1 小时前
一个百度、必应搜索引擎图片获取下载的工具包
golang·图搜索
&岁月不待人&1 小时前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove1 小时前
G1垃圾回收器日志详解
java·开发语言
无尽的大道1 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio1 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE1 小时前
【Java SE】StringBuffer
java·开发语言