[Go笔记] 基础-01: Golang发展简史、著名项目及基本使用
引言
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语言的诞生是为了解决当时编程领域所面临的一系列挑战:
编译速度: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直接运行
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命令的常用参数及其作用。通过这些参数,我们可以更灵活地控制构建过程,以满足不同的需求。
语法注意事项
- 源文件以“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文档是非常重要的技能,所以一定要掌握。
[Go笔记] 基础-01: Golang发展简史、著名项目及基本使用的更多相关文章
- 发展简史jQuery时间轴特效
发展简史jQuery时间轴特效.这是一款鼠标滚动到一定的高度动画显示企业发展时间轴特效.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class="wr ...
- Web前端发展简史
Web前端发展简史 有人说“前端开发”是IT界最容易被误解的岗位,这不是空穴来风.如果你还认为前端只是从美工那里拿到切图, JS和CSS一番乱炖,难搞的功能就去网上信手拈来,CtrlC + Ctrl ...
- iOS回顾笔记( 01 )
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- iOS回顾笔记( 01 )-- XIB和纯代码创建应用的对比
header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...
- Kubernetes 入门必备云原生发展简史
作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 "未来的软件一定是生长于云上的"这是云原生理念的最核心假设.而所谓"云原生",实际上就是在定义一条能 ...
- 【H264】视频编码发展简史
一.常见视频编码格式 编码格式有很多,如下图: 目前比较常用的编码有: H26x系列:由ITU(国际电传视讯联盟)主导,侧重网络传输 MPEG系列:由ISO(国际标准组织机构)下属的MPEG(运动图象 ...
- 小白之Python-基础中的基础01
Python-基础中的基础01 第一次写博客笔记,尝试并监督下自己. 每一天都值得期待! 20170803 -----------------华丽的分界线------------- Python之-- ...
- javascript基础01
javascript基础01 Javascript能做些什么? 给予页面灵魂,让页面可以动起来,包括动态的数据,动态的标签,动态的样式等等. 如实现到轮播图.拖拽.放大镜等,而动态的数据就好比不像没有 ...
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
随机推荐
- NUXT3.0实现网络请求二次封装
最近在开发基于nuxt3.0的项目,看了官网的网络请求,感觉不太适合,就自己基于官网的useFetch()方法封装了一个网络请求,下面开始实现封装. 第一步:新建http.ts文件,用于编写封装代码 ...
- pages.json 文件:自定义导航栏
自定义导航栏使用注意 当navigationStyle设为custom或titleNView设为false时,原生导航栏不显示,此时要注意几个问题: 非H5端,手机顶部状态栏区域会被页面内容覆盖.这是 ...
- Redis - 二进制位数组
简介 Redis 使用字符串对象来表示位数组,因为字符串对象使用的 SDS 数据结构是二进制安全的,所以程序可以直接使用 SDS 结构来保存位数组,并使用 SDS 结构的操作函数来处理位数组. 在 S ...
- [SWPUCTF 2021 新生赛]no_wakeup
[SWPUCTF 2021 新生赛]no_wakeup 考点 反序列化 一.题目 打开题目发现如下代码 <?php header("Content-type:text/html;cha ...
- Pycharm激活码,Pycharm稳定专属激活码(持续更新)
分享一下 PyCharm 2023.1.2 最新激活注册码,破解教程如下,可免费永久激活,亲测有效,下面是详细文档哦~ 申明:本教程 PyCharm 激活码收集于网络,请勿商用,仅供个人学习使用,如有 ...
- < Python全景系列-9 > Python 装饰器:优雅地增强你的函数和类
欢迎来到我们的系列博客<Python全景系列>第九篇!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法.无论你是编程新手,还 ...
- STM32 + RT-Thread + LwIp + DM9000
一.概述 开发板:STM32F103ZET6(战舰) RT-Thread:5.0.0 LwIp:2.1.2 网卡芯片:DM9000 编译环境:keil 我简单了解了一下,在嵌入式中,网络芯片的使用方式 ...
- 【Rust-book】第五章 使用结构体来组织相关联的数据
第五章 使用结构体来组织相关联的数据 结构,或者结构体,是一种自定义数据类型,它允许我们命名多个相关的值并将它们组成一个有机的结合体. 可以把结构体视作对象中的数据属性 1 对比元组和结构体之间的异同 ...
- Go语言中的结构体:灵活性与可扩展性的重要角色
1. 引言 结构体是Go语言中重要且灵活的概念之一.结构体的使用使得我们可以定义自己的数据类型,并将不同类型的字段组合在一起,实现更灵活的数据结构.本文旨在深入介绍Go语言中的结构体,揭示其重要性和灵 ...
- Javaweb文件上传至服务器/从服务器下载
Javaweb文件上传至服务器/从服务器下载 思路图 文件上传思路: 也可以直接看代码 判断是不是文件表单(判断form的enctype是不是="multipart/form-data&qu ...