Golang发展简史、著名项目及官方库API文档基本使用
引言
Golang,又称Go语言,是一门开源的静态类型编译型编程语言。自从2007年由谷歌的罗伯特·格里泽默(Robert Griesemer)、罗布·派克(Rob Pike)和肯·汤普森(Ken Thompson)共同设计,Go语言已经成为了众多开发者的首选。
发展史
2009年11月,Go语言正式对外公布。2012年,Go 1.0版本发布。自那时起,Go语言已经成为了许多知名项目的基石。如今,Go语言已经是全球范围内最受欢迎的编程语言之一。
使用Go语言开发的著名项目:
项目名称 | 项目描述 | 开源链接 |
---|---|---|
Kubernetes | 容器编排平台 | https://github.com/kubernetes/kubernetes |
Docker | 容器化平台 | https://github.com/docker/docker-ce |
etcd | 分布式键值存储系统 | https://github.com/etcd-io/etcd |
Prometheus | 监控系统和时间序列数据库 | https://github.com/prometheus/prometheus |
Grafana | 数据可视化和监控平台 | https://github.com/grafana/grafana |
InfluxDB | 时间序列数据库 | https://github.com/influxdata/influxdb |
CockroachDB | 分布式SQL数据库 | https://github.com/cockroachdb/cockroach |
Go Ethereum | 以太坊区块链的Go实现 | https://github.com/ethereum/go-ethereum |
Caddy | 用Go编写的Web服务器和反向代理 | https://github.com/caddyserver/caddy |
Hugo | 快速的静态网站生成器 | https://github.com/gohugoio/hugo |
... | _ | _ |
这些项目展示了Go语言在多种领域的广泛应用,包括容器化、监控、数据库、区块链、Web服务器等。
项目的诞生原因
Go语言的诞生是为了解决当时编程领域所面临的一系列挑战:
-
编译速度:C++的编译速度较慢,这使得开发效率大打折扣。Go语言的设计者们希望创建一种编译速度更快的语言。
-
依赖管理:C++的依赖管理非常复杂。Go语言通过引入包(package)机制,简化了依赖管理。
-
并发编程:现代计算机的多核处理器要求编程语言能够更好地支持并发编程。Go语言通过内置的goroutine和channel机制,提供了简单易用的并发编程支持。
-
内存安全:C++的内存管理容易出错,导致内存泄漏和程序崩溃。Go语言通过垃圾回收机制,提高了内存安全性。
-
代码可读性:Go语言的设计者们希望创建一种简洁、易读的编程语言,从而提高代码的可维护性。
开发团队:
罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。
Go语言的吉祥物 - 金花鼠Gordon。
优势
Go语言在以下方面表现出了显著的优势:
-
快速编译:Go语言的编译速度非常快,大大提高了开发效率。
-
简洁易读:Go语言的语法简洁,易于理解。这使得代码更容易维护和调试。
-
高效并发:Go语言提供了简单易用的并发编程支持,充分发挥了现代多核处理器的性能。
-
内存安全:Go语言的垃圾回收机制有效地解决了内存泄漏和程序崩溃等问题。
-
跨平台:Go语言支持跨平台编译,可以轻松地在不同操作系统和架构上运行。
-
丰富的标准库和生态系统:Go语言拥有丰富的标准库和第三方库,覆盖了Web开发、数据库操作、加密解密等众多领域。此外,Go语言的生态系统也非常繁荣,
重要版本
以下是一个表格,描述了Go语言的重要版本及其发布时间:
版本号 | 发布时间 | 主要特性与改进 |
---|---|---|
1.0 | 2012年3月28日 | 第一个稳定版本,标志着Go语言正式进入生产环境 |
1.1 | 2013年5月13日 | 优化垃圾回收器和调度器,引入新的sync 和testing 包 |
1.5 | 2015年8月19日 | 完全用Go语言编写的编译器和运行时,改进垃圾回收器 |
1.7 | 2016年8月15日 | 引入子测试和子基准测试功能,加入对context 包的支持 |
1.8 | 2017年2月16日 | 引入HTTP/2服务器推送支持,改进垃圾回收器 |
1.9 | 2017年8月24日 | 引入类型别名功能,改进垃圾回收器 |
1.11 | 2018年8月24日 | 引入Go模块(Modules)功能,提供版本化依赖管理的官方支持 |
1.13 | 2019年9月3日 | 引入对Go模块代理(Module Proxy)的默认支持,改进错误处理 |
1.16 | 2021年2月16日 | 引入对嵌入静态文件的支持(embed 包),改进Go模块支持 |
1.18 | 2022年3月20日 | Go社区等待了多年的泛型语法特性终于加入Go中 |
用go语言的公司
这个不用多做介绍,作为开发Go语言的公司,当仁不让。Google基于Go有很多优秀的项目,比如:kubernetes ,大家也可以在Github上 https://github.com/google/ 查看更多Google的Go开源项目。
Facebook也在用,为此他们还专门在Github上建立了一个开源组织facebookgo,比如著名的是平滑升级的grace。
腾讯
腾讯作为国内的大公司,还是敢于尝试的,尤其是Docker容器化这一块,他们在15年已经做了docker万台规模的实践,具体可以参考http://www.infoq.com/cn/articles/tencent-millions-scale-docker-application-practice 。
腾讯作为主要使用C/C++的公司,使用Go会方便很多,也有很多优势.不过日积月累的C/C++代码很难改造,也不敢动,所以新业务会在Go方面尝试。
百度
目前所知的百度的使用是在运维这边,是百度运维的一个BFE项目,负责前端流量的接入。他们的负责人在2016年有分享,大家可以看下这个 http://www.infoq.com/cn/presentations/application-of-golang-in-baidu-frontend .
其次就是百度的消息系统,从其最近的Golang招聘介绍就可以看出来.
京东
京东云消息推送系统、云存储,以及京东商城等都有使用Go做开发。
小米
小米对Golang的支持,莫过于运维监控系统的开源,也就是 http://open-falcon.com/ 。
此外,小米互娱、小米商城、小米视频、小米生态链等团队都在使用Golang。
360
360对Golang的使用也不少,一个是开源的日志搜索系统Poseidon,托管在Github上,https://github.com/Qihoo360/poseidon.
还有360的推送团队也在使用,他们还写了篇博文在Golang的官方博客上 https://blog.golang.org/qihoo
美团、滴滴、新浪、阿里、京东以及七牛等。一般的选择,都是选择用于自己公司合适的产品系统来做,比如消息推送的、监控的、容器的等,Golang特别适合做网络并发的服务,这是他的强项,所以也是被优先用于这些项目。
开发工具介绍
- visual studio code, Microsoft产品(简称VSCode):一个运行于Mac Os、Windows和Linux 之上的,默认提供Go语言的语法高亮,安装Go语言插件,还可以支持智能提示,编译运行等功能。
- Sublime Text,可以免费使用,默认也支持Go代码语法高亮,只是保存次数达到一定数量之后就会提示是否购买,点击取消继续用,和正式注册版本没有任何区别
- Vim: Vim是从vi发展出来的一个文本编辑器,代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用
- Emacs : Emacs传说中的神器,她不仅仅是一个编辑器,因为功能强大,可称它为集成开发环境
- Eclipse IDE工具,开源免费,并提供GoEclipse插件
- LitelDE,LitelDE是一款专门为Go语言开发的跨平台轻量级集成开发环境(IDE),是中国人开发的。
- JetBrains公司的产品:PhpStrom、WebStrom和PyCharm等IDE工具,都需要安装Go插件。
开发环境搭建
搭建Go开发环境 - 安装和配置SDK
基本介绍:
- SDK的全称(Software Development Kit 软件开发工具包)
- SDK是提供给开发人员使用的,其中包含了对应开发语言的工具包。
SDK下载
- Go语言的官网为: golang.org ,无法访问,需要FQ。
- SDK下载地址 : Golang中文社区:https://studygolang.com/dl
安装SDK:
请注意:安装路径不要有中文或者特殊符号如空格等
SDK基本上是傻瓜式安装,解压就可以使用
测试SDK环境搭建成功
进入控制命令台 执行 go version
命令
注:Windows 下需要配置path环境变量
HelloWorld
go基本目录结构:
开始写代码: 第一个HelloWorld :
// 声明主包
package main
// 导入 fmt 包,用于格式化输出
import "fmt"
// main 函数是程序的入口点
func main() {
// 使用 fmt 包的 Println 函数输出 "hello, world"
fmt.Println("hello, world")
}
运行方式
- 编译后运行
- 通过go run直接运行
上述两种执行流程的方式区别
- 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件变大了很多。
- 如果我们先编译生成了可执行女件,那么我们可以将该可执行文件拷贝到没有go开发环境的机器上,仍然可以运行
- 如果我们是直接go run go源代码,那么如果要在另外一个机器上这么运行,也需要go开发环境,否则无法执行。
- go run运行时间明显要比第一种方式 长一点点
以下是一个表格,描述了go build
命令的常用参数及其作用:
参数 | 作用 |
---|---|
-o | 设置输出文件的名称 |
-i | 安装依赖包的目标文件 |
-v | 显示正在编译的包的名称 |
-x | 打印构建过程中执行的所有命令 |
-race | 启用竞态检测 |
-tags | 设置构建标签,以控制源代码中条件编译的部分 |
-ldflags | 设置传递给链接器的参数 |
-gcflags | 设置传递给编译器的参数 |
-mod | 设置模块下载模式 |
-trimpath | 从生成的可执行文件中移除所有文件路径信息 |
这个表格总结了go build
命令的常用参数及其作用。通过这些参数,我们可以更灵活地控制构建过程,以满足不同的需求。
语法注意事项
- 源文件以“go”为扩展名。
- 程序的执行入口是main()函数。
- 严格区分大小写。
- 方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性。
- Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
- 定义的变量或者import的包如果没有使用到,代码不能编译通过。
- 大括号都是成对出现的,缺一不可
注释
Golang中注释类型:
Go支持c语言风格的/**/
块注释,也支持c++风格的//
行注释。行注释更通用,块注释主要用于针对包的详细说明或者屏蔽大块的代码
- 行注释 // VSCode快捷键:ctrl+/ 再按一次取消注释
- 块注释(多行注释) /**/ VSCode快捷键:shift+alt+a 再按一次取消注释
注意:块注释中不可以嵌套块注释
PS:官方推荐使用行注释 //
代码风格
可以使用 gofmt
实现代码的格式化,所以不用太担心风格上的问题,更多的是注意代码规范。
以下是一个描述了gofmt
命令的常用参数及其作用的表格:
参数 | 作用 |
---|---|
-l | 列出需要格式化的文件名,而不是直接修改文件 |
-w | 将格式化后的内容直接写回文件 |
-s | 对代码进行简化,例如将x[0:len(x)]简化为x[:] |
-d | 显示格式化前后的差异,而不是直接修改文件 |
-e | 打印所有格式化错误,而不是默认的前10个错误 |
-cpuprofile | 将CPU使用情况写入指定的文件,用于性能分析 |
点击查看cpuprofile对应用法
## `cpuprofile`cpuprofile
参数用于生成gofmt
命令的CPU使用情况分析文件。这在分析gofmt
的性能和优化时非常有用。下面是如何使用cpuprofile
参数的示例:
- 首先,运行
gofmt
命令并使用cpuprofile
参数指定一个输出文件,例如cpu.prof
。这将对指定的Go源文件(如main.go
)进行格式化,并将CPU使用情况写入cpu.prof
文件。
gofmt -w -cpuprofile=cpu.prof main.go
- 然后,使用
go tool pprof
命令分析生成的cpu.prof
文件。这将启动一个交互式的分析器,我们可以在其中执行各种命令以查看CPU使用情况。
go tool pprof cpu.prof
- 在交互式分析器中,我们可以使用
top
命令查看CPU使用最高的函数。此外,还可以使用web
或svg
命令生成可视化的调用图。例如:
(pprof) top
(pprof) web
(pprof) svg
通过-cpuprofile
参数,我们可以分析gofmt
命令的性能,并找出可能的性能瓶颈。这对于优化gofmt
或诊断潜在问题非常有用。
常用 go cmd 命令
命令 | 作用 |
---|---|
go mod init | 初始化一个新的模块,创建go.mod 文件 |
go get | 下载并安装指定的依赖包,同时更新go.mod 文件 |
go get -u | 更新所有依赖包,同时更新go.mod 文件 |
go mod tidy | 移除未使用的依赖包,更新go.mod 文件 |
go list -m all | 显示项目的所有依赖包及其版本信息 |
go build | 构建项目,根据go.mod 文件下载并构建依赖包 |
go install | 安装项目,根据go.mod 文件下载并构建依赖包 |
gofmt | 格式化Go代码,保持一致的代码风格 |
goimports | 自动添加或删除代码中的导入语句,以满足实际的依赖关系 |
通过这些命令,我们可以轻松地管理项目的依赖关系、格式化代码以及构建和安装项目。
查看API文档
Go语言提供了大量的标准库,因此 google 公司也为这些标准库提供了相应的API文档,用于告诉开发者如何使用这些标准库,以及标准库包含的方法。官方位置:https://golang.org
-
在线查看文档:访问https://pkg.go.dev/std,这个网站提供了Go语言官方库的文档。我们可以在搜索框中输入包名或关键字,快速找到相关文档。
- 不FQ:Golang中文网在线标准库文档: https://studygolang.com/pkgdoc
-
使用
godoc
命令行工具:在终端中输入godoc <包名>
,例如godoc fmt
,godoc
将显示fmt
包的文档。我们还可以使用-src
参数查看包的源代码,例如godoc -src fmt Println
。 -
运行本地
godoc
服务器:在终端中输入godoc -http=:6060
,这将启动一个本地的godoc
服务器。然后,我们可以在浏览器中访问http://localhost:6060/pkg来查看本地安装的所有Go包的文档,包括官方库。这对于离线查看文档非常有用。 -
使用集成开发环境(IDE)或代码编辑器:许多IDE和代码编辑器(如Visual Studio Code、GoLand等)都提供了查看Go包文档的功能。通常,我们只需将鼠标悬停在代码中的标识符上,就可以查看相关的文档。这使得在编写代码时查看文档变得非常方便。
在学习和使用Go语言时,熟练查找和阅读API文档是非常重要的技能,所以一定要掌握。
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。