引言

Golang,又称Go语言,是一门开源的静态类型编译型编程语言。自从2007年由谷歌的罗伯特·格里泽默(Robert Griesemer)、罗布·派克(Rob Pike)和肯·汤普森(Ken Thompson)共同设计,Go语言已经成为了众多开发者的首选。

.center { display: block; margin-left: auto; margin-right: auto; width: 90% }

发展史

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加入项目。

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

优势

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 命令

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

HelloWorld

go基本目录结构:

开始写代码: 第一个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文档是非常重要的技能,所以一定要掌握。

[Go笔记] 基础-01: Golang发展简史、著名项目及基本使用的更多相关文章

  1. 发展简史jQuery时间轴特效

    发展简史jQuery时间轴特效.这是一款鼠标滚动到一定的高度动画显示企业发展时间轴特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="wr ...

  2. Web前端发展简史

    Web前端发展简史 有人说“前端开发”是IT界最容易被误解的岗位,这不是空穴来风.如果你还认为前端只是从美工那里拿到切图, JS和CSS一番乱炖,难搞的功能就去网上信手拈来,CtrlC + Ctrl ...

  3. iOS回顾笔记( 01 )

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)

    注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...

  5. iOS回顾笔记( 01 )-- XIB和纯代码创建应用的对比

    header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...

  6. Kubernetes 入门必备云原生发展简史

    作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 "未来的软件一定是生长于云上的"这是云原生理念的最核心假设.而所谓"云原生",实际上就是在定义一条能 ...

  7. 【H264】视频编码发展简史

    一.常见视频编码格式 编码格式有很多,如下图: 目前比较常用的编码有: H26x系列:由ITU(国际电传视讯联盟)主导,侧重网络传输 MPEG系列:由ISO(国际标准组织机构)下属的MPEG(运动图象 ...

  8. 小白之Python-基础中的基础01

    Python-基础中的基础01 第一次写博客笔记,尝试并监督下自己. 每一天都值得期待! 20170803 -----------------华丽的分界线------------- Python之-- ...

  9. javascript基础01

    javascript基础01 Javascript能做些什么? 给予页面灵魂,让页面可以动起来,包括动态的数据,动态的标签,动态的样式等等. 如实现到轮播图.拖拽.放大镜等,而动态的数据就好比不像没有 ...

  10. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

随机推荐

  1. SSH客户端常用工具SecureCRT操作

    目录 1.1 SecureCRT工具介绍 1.2 SecureCRT工具安装 1.3配置SecureCRT连接Linux主机 1.4调整SecureCRT终端显示和回滚缓冲区大小 1.5调整字体及光标 ...

  2. .NET Core 波场链离线签名、广播交易(发送 TRX和USDT)笔记

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. ...

  3. pngquant 在 Windows 上压缩带中文路径的 png 图片

    pngquant 是一个优秀的 png 压缩工具,但是在 Windows 上不支持目录中带有 unicode 字符(例如中文)的文件.所以要用一个折中的办法(即标准输入)让 pngquant 压缩目录 ...

  4. 2020-09-06:Docker的命名空间有哪些?

    福哥答案2020-09-06: 福哥口诀法:命进I网挂U用 1.进程命名空间.CLONE_NEWPID.进程编号. 2.IPC 命名空间.CLONE_NEWPIPC.信号量.消息队列何共享内存. 3. ...

  5. Selenium - 元素等待(2) - 显式等待/EC等待

    Selenium - 元素等待 显式等待 显式等待是一种灵活的等待方式,需要声明等待的结束条件,当满足条件时会自动结束等待: 需要引入WebDriverWait包以及exception_conditi ...

  6. xshell入门及Linux常用命令

    一.首先您的xshell先连接上需要远程连接的服务器. 二.打开连接,出现下记页面,就证明与服务器连接正常了. 三.接下来,我们就可以使用命令做一系列操作了. 3-1:cd 是进入下一级目录命令 例如 ...

  7. 500行代码代码手写docker-将rootfs设置为只读镜像

    (3)500行代码代码手写docker-将rootfs设置为只读镜像 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现 ...

  8. linux 账户和权限

    目录 一.用户账户管理 二.组账号管理 三.用户账户文件和组账户文件 四.查询账户命令 五.设置目录与文件权限 六.设置命令与文件归属 七.默认文件属性umask 八.修改主机名 一.用户账户管理 u ...

  9. odoo总结---类继承和视图继承

    类继承 自从有了类,就有继承,继承是类最大的特性,ODOO开发有不例外,先ODOO集采总结如下: 1)类继承:扩展类中没有_name属性,因为它继承了父类的_name.对现有模型的扩展, 添加新功能, ...

  10. 使用git 将本地代码上传码市私用仓库操作

    1  现在在登录码市建立项目 2   本地建立一个文件夹,然后使用git bash 3   初始化本地库  git init 4,进入刚刚在码云新建的项目里,复制框框里的路径 5,然后在回到本地新建的 ...