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语言的诞生是为了解决当时编程领域所面临的一系列挑战:

  1. 编译速度:C++的编译速度较慢,这使得开发效率大打折扣。Go语言的设计者们希望创建一种编译速度更快的语言。

  2. 依赖管理:C++的依赖管理非常复杂。Go语言通过引入包(package)机制,简化了依赖管理。

  3. 并发编程:现代计算机的多核处理器要求编程语言能够更好地支持并发编程。Go语言通过内置的goroutine和channel机制,提供了简单易用的并发编程支持。

  4. 内存安全:C++的内存管理容易出错,导致内存泄漏和程序崩溃。Go语言通过垃圾回收机制,提高了内存安全性。

  5. 代码可读性:Go语言的设计者们希望创建一种简洁、易读的编程语言,从而提高代码的可维护性。

开发团队:

罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。
image

Go语言的吉祥物 - 金花鼠Gordon。

image

优势

Go语言在以下方面表现出了显著的优势:

  1. 快速编译:Go语言的编译速度非常快,大大提高了开发效率。

  2. 简洁易读:Go语言的语法简洁,易于理解。这使得代码更容易维护和调试。

  3. 高效并发:Go语言提供了简单易用的并发编程支持,充分发挥了现代多核处理器的性能。

  4. 内存安全:Go语言的垃圾回收机制有效地解决了内存泄漏和程序崩溃等问题。

  5. 跨平台:Go语言支持跨平台编译,可以轻松地在不同操作系统和架构上运行。

  6. 丰富的标准库和生态系统:Go语言拥有丰富的标准库和第三方库,覆盖了Web开发、数据库操作、加密解密等众多领域。此外,Go语言的生态系统也非常繁荣,

重要版本

以下是一个表格,描述了Go语言的重要版本及其发布时间:

版本号 发布时间 主要特性与改进
1.0 2012年3月28日 第一个稳定版本,标志着Go语言正式进入生产环境
1.1 2013年5月13日 优化垃圾回收器和调度器,引入新的synctesting
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语言的公司

Google

这个不用多做介绍,作为开发Go语言的公司,当仁不让。Google基于Go有很多优秀的项目,比如:kubernetes ,大家也可以在Github上 https://github.com/google/ 查看更多Google的Go开源项目。

Facebook

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特别适合做网络并发的服务,这是他的强项,所以也是被优先用于这些项目。

开发工具介绍

  1. visual studio code, Microsoft产品(简称VSCode):一个运行于Mac Os、Windows和Linux 之上的,默认提供Go语言的语法高亮,安装Go语言插件,还可以支持智能提示,编译运行等功能。
  2. Sublime Text,可以免费使用,默认也支持Go代码语法高亮,只是保存次数达到一定数量之后就会提示是否购买,点击取消继续用,和正式注册版本没有任何区别
  3. Vim: Vim是从vi发展出来的一个文本编辑器,代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用
  4. Emacs : Emacs传说中的神器,她不仅仅是一个编辑器,因为功能强大,可称它为集成开发环境
  5. Eclipse IDE工具,开源免费,并提供GoEclipse插件
  6. LitelDE,LitelDE是一款专门为Go语言开发的跨平台轻量级集成开发环境(IDE),是中国人开发的。
  7. JetBrains公司的产品:PhpStrom、WebStrom和PyCharm等IDE工具,都需要安装Go插件。

开发环境搭建

搭建Go开发环境 - 安装和配置SDK

基本介绍:

  1. SDK的全称(Software Development Kit 软件开发工具包)
  2. SDK是提供给开发人员使用的,其中包含了对应开发语言的工具包。

SDK下载

  1. Go语言的官网为: golang.org ,无法访问,需要FQ。
  2. SDK下载地址 : Golang中文社区:https://studygolang.com/dl

安装SDK:

请注意:安装路径不要有中文或者特殊符号如空格等

SDK基本上是傻瓜式安装,解压就可以使用

测试SDK环境搭建成功

进入控制命令台 执行 go version 命令
image

注:Windows 下需要配置path环境变量

HelloWorld

go基本目录结构:

image

开始写代码: 第一个HelloWorld :

// 声明主包
package main

// 导入 fmt 包,用于格式化输出
import "fmt"

// main 函数是程序的入口点
func main() {
	// 使用 fmt 包的 Println 函数输出 "hello, world"
	fmt.Println("hello, world")
}

运行方式

  1. 编译后运行
  2. 通过go run直接运行
sequenceDiagram participant 开发者 participant Go工具链 participant 源代码 participant 可执行文件 开发者->>Go工具链: go run <源文件> Go工具链->>源代码: 读取源代码 Go工具链->>Go工具链: 编译源代码 Go工具链->>开发者: 运行程序 开发者->>Go工具链: go build -o <可执行文件名> <源文件> Go工具链->>源代码: 读取源代码 Go工具链->>可执行文件: 生成可执行文件 开发者->>可执行文件: 运行可执行文件

上述两种执行流程的方式区别

  • 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件变大了很多。
  • 如果我们先编译生成了可执行女件,那么我们可以将该可执行文件拷贝到没有go开发环境的机器上,仍然可以运行
  • 如果我们是直接go run go源代码,那么如果要在另外一个机器上这么运行,也需要go开发环境,否则无法执行。
  • go run运行时间明显要比第一种方式 长一点点

以下是一个表格,描述了go build命令的常用参数及其作用:

参数 作用
-o 设置输出文件的名称
-i 安装依赖包的目标文件
-v 显示正在编译的包的名称
-x 打印构建过程中执行的所有命令
-race 启用竞态检测
-tags 设置构建标签,以控制源代码中条件编译的部分
-ldflags 设置传递给链接器的参数
-gcflags 设置传递给编译器的参数
-mod 设置模块下载模式
-trimpath 从生成的可执行文件中移除所有文件路径信息

这个表格总结了go build命令的常用参数及其作用。通过这些参数,我们可以更灵活地控制构建过程,以满足不同的需求。

语法注意事项

  1. 源文件以“go”为扩展名。
  2. 程序的执行入口是main()函数。
  3. 严格区分大小写。
  4. 方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性。
  5. Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
  6. 定义的变量或者import的包如果没有使用到,代码不能编译通过。
  7. 大括号都是成对出现的,缺一不可

注释

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参数的示例:

  1. 首先,运行gofmt命令并使用cpuprofile参数指定一个输出文件,例如cpu.prof。这将对指定的Go源文件(如main.go)进行格式化,并将CPU使用情况写入cpu.prof文件。
gofmt -w -cpuprofile=cpu.prof main.go

  1. 然后,使用go tool pprof命令分析生成的cpu.prof文件。这将启动一个交互式的分析器,我们可以在其中执行各种命令以查看CPU使用情况。
go tool pprof cpu.prof

  1. 在交互式分析器中,我们可以使用top命令查看CPU使用最高的函数。此外,还可以使用websvg命令生成可视化的调用图。例如:
(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

  1. 在线查看文档:访问https://pkg.go.dev/std,这个网站提供了Go语言官方库的文档。我们可以在搜索框中输入包名或关键字,快速找到相关文档。

  2. 使用godoc命令行工具:在终端中输入godoc <包名>,例如godoc fmtgodoc将显示fmt包的文档。我们还可以使用-src参数查看包的源代码,例如godoc -src fmt Println

  3. 运行本地godoc服务器:在终端中输入godoc -http=:6060,这将启动一个本地的godoc服务器。然后,我们可以在浏览器中访问http://localhost:6060/pkg来查看本地安装的所有Go包的文档,包括官方库。这对于离线查看文档非常有用。

  4. 使用集成开发环境(IDE)或代码编辑器:许多IDE和代码编辑器(如Visual Studio Code、GoLand等)都提供了查看Go包文档的功能。通常,我们只需将鼠标悬停在代码中的标识符上,就可以查看相关的文档。这使得在编写代码时查看文档变得非常方便。

在学习和使用Go语言时,熟练查找和阅读API文档是非常重要的技能,所以一定要掌握。

posted @ 2023-08-06 11:31  Bingo-he  阅读(703)  评论(0编辑  收藏  举报