Go 语言是最近几年成长起来的语言。具有并发编程设计优势,不仅在云开发上有着很重要地位,还在云原生生态里占有重要地位。 Go 语法简单,容易上手,同时社区生态也比较活跃,是一门值得学习的后端语言。有一些成熟的后端框架;go 拥有容易开发,更加简洁,所以把 go 作为高级语言入门也是非常不错的。目前在市场上,主要是服务端开发、中间件、游戏,区块链,云原生等方向上发展。
golang(go)是一种过程编程语言,可用于快速机器代码编译。它是一种静态类型的编译语言。它提供了并发机制,可以轻松开发多核和联网的机器级程序。它是快速,动态类型和解释语言;它提供对接口和类型嵌入的支持。
golang的特点
- 语法简洁
Go语言简单易学,学习曲线平缓,Go 语言被称为“互联网时代的C语言”。Go语言的风格类似于C语言。其语法在C语言的基础上进行了大幅的简化
- 代码风格统一
Go语言提供了一套格式化工具——gofmt,Go 团队构建了一个名为 gopls 的服务,它实现了语言服务器协议LSP,这样就保证了不同开发者提交的代码都是统一的格式。
- 执行性能好
Go语言是一门编译型的语言,我们编写好的代码直接编译成服务器可以执行的二进制可执行文件。
- 开发效率高
Go语言虽然是一门编译型的语言,但是它内置了垃圾回收机制,降低了开发者的心智负担,使其拥有像Python、PHP等解释性语言的一样的开发效率。真正实现了开发效率和执行效率的完美结合。
- 天生支持并发
Go于2009年发布,当时多核处理器已经上市。Go语言在多核并发上拥有原生的设计优势,Go语言从底层原生支持并发,无须第三方库、开发者的编程技巧和开发经验。
golang的优势
- 学习曲线容易
Go语言语法简单,类C语法。直来直去的,学习曲线很低,上手非常快、高性能的应用。在国内大家都追求快。
-
效率:快速的编译时间,开发效率和运行效率高
-
自由高效:组合的思想、无侵入式的接口
Go语言可以说是开发效率和运行效率二者的完美融合,天生的并发编程支持。Go语言支持当前所有的编程范式,包括过程式编程、面向对象编程、面向接口编程、函数式编程。程序员们可以各取所需、自由组合、想怎么玩就怎么玩。
- 强大的标准库
Go内置了大量的库,特别是网络库非常强大。内置强大的工具,Go语言里面内置了很多工具链,最好的应该是gofmt工具,自动化格式化代码,能够让团队review变得如此的简单,代码格式一模一样,想不一样都很困难。
-
部署方便:二进制文件,部署简单
-
简单的并发
并行和异步编程几乎无痛点。Go 语言的 Goroutine 和 Channel 这两个简直就是并发和异步编程的神器。
Go 是一种非常高效的语言,高度支持并发性。Go是为大数据. 微服务. 并发而生的一种编程语言。
Go 作为一门语言致力于使事情简单化。它并未引入很多新概念,而是聚焦于打造一门简单的语言,它使用起来异常快速并且简单。其唯一的创新之处是 goroutines 和通道。Goroutines 是 Go 面向线程的轻量级方法,而通道是 goroutines 之间通信的优先方式。
创建 Goroutines 的成本很低,只需几千个字节的额外内存,正由于此,才使得同时运行数百个甚至数千个 goroutines 成为可能。可以借助通道实现 goroutines 之间的通信。Goroutines 以及基于通道的并发性方法使其非常容易使用所有可用的 CPU 内核,并处理并发的 IO。相较于 Python/Java,在一个 goroutine 上运行一个函数需要最小的代码。
- 稳定性
Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如go tool、gofmt、go test。
- 跨平台编译
如果你写的Go代码不包含cgo,那么就可以做到window系统编译linux的应用,如何做到的呢?Go引用了plan9的代码,这就是不依赖系统的信息。
Go适合用来做什么
-
服务器编程,用Go来做很合适,例如处理日志、数据打包、虚拟机处理等。
-
分布式系统,数据库代理器,网关,tidb,cockroach 等
-
网络编程,这一块目前应用最广,包括Web应用、API应用
-
内存数据库,前一段时间google开发的groupcache,couchbase的部分组建
-
云原生,很多云原生在采用Go开发,CloudFoundy,k8s,docker ...。
-
区块链项目,以太坊,hyperledger 等
那些公司在使用呢
国外公司,如Google、Docker、Apple、Cloud Foundry、CloudFlare、Couchbase、CoreOS、、AWS等公司; 国内企业:如阿里云、百度、腾讯、小米、七牛、PingCAP、华为、金山 等公司。
环境准备
官网提供了各种环境的安装包,建议安装最新的稳定版,go 安装的时候会帮我们设置环境变量,go 有两个比较迷惑的环境变量 GOPATHGOROOT 前者是我们的项目存放的路径,后者是 go 安装路径。在 go mod 没有应用的版本,go 项目只能存在GOPATH 路径,后来修复了这个槽点,目前GOPATH 主要用于存放 go get 获取的项目,而开发项目路径随意。 GoLand/VsCode: 一个编辑器,编辑器为我们提供很多便利,诸如代码补全,自动包导入等,最初学习编程的时候,网上有很多帖子说不要用高级编辑器,要从文本编辑器一行行手敲代码做起,其实不然,编程绝不是背代码,理解并学会使用才是核心。
检查环境: 输入 go version查看版本号及go env查看环境变量。以及后续 go 程序的运行,go get 等都需要用到命令行操作。
环境搭建
配置GOPATH
export GOROOT="$HOME/gopath/go"
export GOPATH="$HOME/gopath"
export GOBIN="$GOPATH/bin"
export PATH="$PATH:$GOROOT/bin:$GOBIN"
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
GOPATH是一个环境变量,用来表明你写的go项目的存放路径 GOPATH路径最好只设置一个,所有的项目代码都放到GOPATH的src目录下。 Linux和Mac平台就参照上面配置环境变量
环境目录
在进行Go语言开发的时候,我们的代码总是会保存在$GOPATH/src目录下。在工程经过go build、go install或go get等指令后,会将下载的第三方包源代码文件放在$GOPATH/src目录下, 产生的二进制可执行文件放在 $GOPATH/bin目录下,生成的中间缓存文件会被保存在 $GOPATH/pkg 下。
如果我们使用版本管理工具(Git)来管理我们的项目代码时,我们只需要添加$GOPATH/src目录的源代码即可。bin 和 pkg 目录的内容无需版本控制。
golang 安装版本 go version go1.20.2 linux/amd64
GOPATH 下目录
.
├── bin
│ ├── dlv
│ ├── gomodifytags
│ ├── go-outline
│ ├── goplay
│ ├── gopls
│ ├── gotests
│ ├── impl
│ └── staticcheck
├── go
├── pkg
│ ├── mod
│ └── sumdb
└── src
├── golang-project-development
└── myfile
pkg下目录结构
├── mod
│ ├── cache
│ ├── github.com
│ ├── go.etcd.io
│ ├── golang.org
│ ├── google.golang.org
│ ├── gopkg.in
│ ├── gorm.io
│ ├── go.starlark.net@v0.0.0-20220816155156-cfacd8902214
│ ├── go.uber.org
│ ├── honnef.co
│ └── mvdan.cc
└── sumdb
└── sum.golang.org
src 下存放开发项目
Go 1.17引入的module依赖图修剪
pkg/mod 下存放go module 库文件,支持版本管理,编译缓存一般在 $HOME/.cache/go-build下
sumdb是一个全局性的、仅可附加的(append)、加密验证的go.sum条目列表。当go get需要在go.sum文件中添加一个条目时,它从sumdb中获取该条目,并对sumdb的完整性进行加密证明。这不仅确保了某一module的每一次构建都使用相同的依赖,而且确保了每一个module都使用相同的依赖内容。
sumdb使那些试图用修改过的(例如放置后门的)源码来攻击特定依赖项变为不可能,甚至谷歌自己运维的Go基础设施也做不到。