• 0x00 前言简述
  • What,什么是Go语言?
  • Why,为啥要用Go语言?
  • How,Go语言发展前景?
  • 0x01 Go语言开发环境搭建
  • 版本平台

  • 开发环境

    (1) Ubuntu桌面版

    (2) 开发编辑器

  • Let,Go

    Hello World

    Http Web Server

    Echo 类似命令程序

  • 0x02 Go 项目结构

0x00 前言简述

为什么你应该学习Go语言?

​etcd、kubernetes、Prometheus​
  • 1.参考 Golang 编程语言排行榜 : https://www.tiobe.com/tiobe-index

1.Go编程快速入门学习_go语言

  • 2.硬件限制(摩尔定律)已然失效

摩尔定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。

1.Go编程快速入门学习_linux_02

从上面的图表可以看出,近十年单线程性能和处理器频率保持稳定。我们不能像之前一样把添加更多晶体管当成是解决方案,因为在较小规模上一些量子特性开始出现(如隧道效应),并且因为在同样小的空间里放置更多晶体管的代价非常昂贵,每1美元可以添加的晶体管数量开始下降。

制造商开始从其他方面提高处理器的性能, 但这中解决方案也有其自身的局限性。因为成本原因我们不能无限制的为计算机添加内核,也无法无限制的添加缓存来提高性能,因为缓存越大,取值的性能越低。

Tips : 一旦我们没有办法在硬件上一直取得突破,我们只能提高软件的性能或者说我们需要高性能的软件。

如上所述,硬件制造商正在为处理器添加越来越多的内核以提高性能。所有数据中心都在这些处理器上运行,更重要的是,今天的应用程序使用多个微服务来维护数据库连接,消息队列和维护缓存。因此,开发的软件和编程语言应该可以轻松地支持并发性,并且应该能够随着CPU核心数量的增加而可扩展。


发展历史
描述: 大多数现代编程语言(如Java,Python等)都来自90年代的单线程环境。虽然一些编程语言的框架在不断地提高多核资源使用效率,例如 Java 的 Netty 等,但仍然需要开发人员花费大量的时间和精力搞懂这些框架的运行原理后才能熟练掌握。

​罗伯特·格瑞史莫、罗勃·派克及肯·汤普逊于开始设计,[3]稍后伊恩·兰斯·泰勒(Ian Lance Taylor)、拉斯·考克斯(Russ Cox)​

1.Go编程快速入门学习_linux_03

  • Go 于 2009年11月正式宣布推出,版本1.0在2012年3月发布,之后Go广泛应用于Google的产品以及许多其他组织和开源项目。
  • Go 于 2009年11月10日由Google发布推出,成为开放源代码项目,支持Linux、macOS、Windows等操作系统。2005 年 AMD 速龙发布第一款民用级多核处理器,所以当时多核处理器已经上市。

1.Go编程快速入门学习_ubuntu_04

​"TIOBE 2016年最佳语言"​

What,什么是Go语言?

​Go(又称Golang[4]-Google-go-language)​​静态强类型​​编译型​​并发型​​垃圾回收功能、优良的并行设计​
​以东尼·霍尔​​Occam​​Limbo​​goroutine​
​C++​​枚举、异常处理、继承、泛型、断言、虚函数​​切片(Slice) 型、并发、管道、垃圾回收功能、接口等​​哈希表(Hashes)​​字典(Dictionaries)​


Goroutine 并行设计
描述:

透过Goroutine能够让程序以异步的方式运行,而不需要担心一个函数导致程序中断,因此Go也非常地适合网络服务。

假设有个程序,里面有两个函数:

如此就不需要等待该函数运行完后才能运行下一个函数。



Wiki 百科 : https://wiki.weiyigeek.top/w/index.php?search=go&title=Special:搜索&go=前往
官方网站 :

Why,为啥要用Go语言?

Go 语言有何特点:

​(自动格式化)​
​go fmt​


​编程范型: 编译型,可平行化,结构化,指令式​
​类似于线程,但并非线程​​大约2KB的内存​
​C,C++​

1.Go编程快速入门学习_go语言_05

由下图可以看出,Go 语言在性能上更接近于 Java 语言,虽然在某些测试用例上不如经过多年优化的 Java 语言,但毕竟 Java 语言已经经历了多年的积累和优化。Go 语言在未来的版本中会通过不断的版本优化提高单核运行性能。

1.Go编程快速入门学习_ubuntu_06


Go 语言的缺陷

Tips : Go 2.0 版本将支持泛型,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。

How,Go语言发展前景?

目前Go语言已经⼴泛应用于人工智能、云计算开发、容器虚拟化、⼤数据开发、数据分析及科学计算、运维开发、爬虫开发、游戏开发等领域。

Go语言简单易学,天生支持并发,完美契合当下高并发的互联网生态,并且在多核并发上拥有原生的设计优势, 很多公司,特别是中国的互联网公司,即将或者已经完成了使用 Go 语言改造旧系统的过程。经过 Go 语言重构的系统能使用更少的硬件资源获得更高的并发和I/O吞吐表现。充分挖掘硬件设备的潜力也满足当前精细化运营的市场大环境。

所以当下程序开发者应该抓住趋势,要学会做一个领跑者而不是跟随者。
国内Go语言的需求潜力巨大,目前无论是国内大厂还是新兴互联网公司基本上都会有Go语言的岗位需求。


Go 在互联网企业应用以及使用它的公司:

  • Go在百度内部应用(百度流量入口BFE、自动驾驶、百度只能小程序、百度APP)
  • Go在腾讯内部应用(蓝鲸运维平台、微服务框架TarsGo、云平台)
  • Go在知乎内部应用(知乎全站重构)

1.Go编程快速入门学习_linux_07

现在就开始你的Go语言学习之旅吧!人生苦短,let’s Go, 下面我们将进行Go开发环境安装实践。

0x01 Go语言开发环境搭建

描述: 本章节主要讲解安装Go语言及搭建Go语言开发环境。

Tips : Go语言1.11版本之后,开启go mod模式之后就不再强制需要配置GOPATH了。
Tips : Go语言1.14版本之后,推荐使用go modules管理依赖,也不再需要把代码写在GOPATH目录下了,之前旧版本的教程戳这个链接。

下载地址:
Go官网下载 : https://golang.org/dl/
Go官方镜像站(推荐):https://golang.google.cn/dl/ & https://studygolang.com/dl


版本平台

描述: Windows平台和Mac平台推荐下载可执行文件版,Linux平台下载压缩文件版。

当前 2021年7月28日 22:43:15 最新版本为1.16.16版。

  • Source: 源代码编译安装-https://dl.google.com/go/go1.16.6.src.tar.gz
  • Binary: 二进制解压安装-https://dl.google.com/go/go1.16.6.linux-amd64.tar.gz

Tips :由于时间的推移的1.16.6版本号可能并不是最新的,但总体来说安装教程是类似的,Go语言更新迭代比较快,推荐使用较新版本,体验最新特性。

​Go 1.14.1​

1.Go编程快速入门学习_ubuntu_08


Linux
如果不是要在Linux平台敲go代码就不需要在Linux平台安装Go,我们开发机上写好的go代码只需要跨平台编译(详见文章末尾的跨平台编译)好之后就可以拷贝到Linux服务器上运行了,这也是go程序跨平台易部署的优势。

1.Go编程快速入门学习_linux_09


开发环境

​Ubuntu 20.04 Desktop​

(1) Ubuntu桌面版

  • Ubuntu 20.04 LTS Desktop 操作系统 : https://ubuntu.com/download/desktop
  • Ubuntu 20.04 LTS Desktop 安装配置 Go 语言:


​go env​


常用变量解析:

​Go 1.8​​Go 1.14​​Go Module​​GOPATH​
  • GOPROXY : 指定代理Go语言从公共代理仓库中快速拉取您所需的依赖代码(建议 Go > 1.13)。


(2) 开发编辑器

​VS Code​​Goland​
  • VS Code 是微软开源的编辑器
  • Goland 是jetbrains出品的付费IDE。

2.1 Visual Studio Code
描述: VS Code全称Visual Studio Code,是微软公司开源的一款免费现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,支持插件扩展,支持 Win、Mac 以及 Linux平台。

Tips : 虽然不如某些IDE功能强大,但是它添加Go扩展插件后已经足够胜任我们日常的Go开发, 并支持三大主流平台都支持,请根据自己的电脑平台选择对应的安装包。

VS Code 官方下载地址:https://code.visualstudio.com/Download


​VS code​


  • Step 2.VS Code 基础 Go 开发环境配置

1.Go编程快速入门学习_linux_10

  • Step 3.编辑器主题变更,依次点击设置->颜色主题,然后在弹出的窗口选择你喜欢的主题, 本人比较喜欢使用Dark 暗黑的主题。
  • Step 4.配置VSCode开启自动保存,依次点击 文件->首选项->设置,打开设置页面就能看到自动保存相关配置如下图,可以根据自己的喜好选择自动保存的方式:
  • Step 5.配置代码片段快捷键,还是按Ctrl/Command+Shift+P,按下图输入>snippets,选择命令并执行, 然后在弹出的窗口点击选择go选项,然后弹出如下代码页面:

1.Go编程快速入门学习_go语言_11

  • Step 6.把上面的代码,按下图方式粘贴到配置文件中,保存并关闭配置文件即可。然后我们打开一个go文件,测试一下效果:

1.Go编程快速入门学习_ubuntu_12


Let,Go

描述: 此处是学习一门新语言的常规操作输出 Hello World , 现在我们来创建第一个Go项目 hello.go

​go mod init 项目名​
​go mod init hello​


Hello World

描述: 接下来在该目录中创建一个helloWorld.go文件

​VScode​​快捷键F5​

1.Go编程快速入门学习_ubuntu_13

Tips : 我们知道作为编译型的语言Go与C语言一样需要编译然后再运行。

Tips : Go 语言函数外的语句必须以关键字开头。


​go build​
​go build​​go build helloworld​

Tips : 如上述编译得到的可执行文件会保存在执行编译命令的当前目录下会有 HelloWorld 可执行文件,如果是windows平台会在当前目录下找到HelloWorld.exe可执行文件。


编译&运行: go Run
描述: 我们也可以直接执行程序,该命令本质上也是先编译再执行。


编译&安装软件包&依赖项: go Install
描述: go install 表示安装的意思,它先编译源代码得到可执行文件,然后将可执行文件移动到GOPATH的bin目录下。因为我们的环境变量中配置了GOPATH下的bin目录,所以我们就可以在任意地方直接执行可执行文件了。


跨平台编译: CGO_ENABLED / GOOS / GOARCH
描述: 默认我们go build的可执行文件都是当前操作系统可执行的文件,如果我想在windows下编译一个linux下可执行文件,那需要怎么做呢?

只需要指定目标操作系统的平台和处理器架构即可,例如Windows平台cmd下按如下方式指定环境变量编译出的可以执行文件则可以在Linux 操作系统 amd64 处理器中执行,然后再执行go build命令,得到的就是能够在Linux平台运行的可执行文件了。

注意:如果你使用的是PowerShell终端,那么设置环境变量的语法为$ENV:CGO_ENABLED=0。


不同平台快速交叉编译:

​Windows​​helloWorld.exe​

Tips : 对比不同平台编译后的可执行文件大小。


Http Web Server

描述: 透过Go仅需几行代码就完成HTTP网页服务器的实现。


Echo 类似命令程序

描述: 用Go去实现一个像Unix中的Echo命令程序。

0x02 Go 项目结构

​$GOPATH/src​​go build、go install​​go get​​$GOPATH/src​​$GOPATH/bin​​$GOPATH/pkg​
​(Version Control System,VCS。常用如Git/Svn)​​$GOPATH/src​


​GOPATH​

(1)适合个人开发者
描述: 我们知道源代码都是存放在GOPATH的src目录下,那我们可以按照下图来组织我们的代码。
1.Go编程快速入门学习_go语言_14


(2)适合企业开发场景
描述: 此种目录结构设置更适合企业开发环境,以代码仓库为前缀并以公司内部组织架构为基准,其次是项目名称,最后是各个模块开发的名称。
1.Go编程快速入门学习_go语言_15


(3)目前流行的项目结构
描述: Go语言中也是通过包来组织代码文件,我们可以引用别人的包也可以发布自己的包,但是为了防止不同包的项目名冲突,我们通常使用顶级域名来作为包名的前缀,这样就不担心项目名冲突的问题了。

因为不是每个个人开发者都拥有自己的顶级域名,所以目前流行的方式是使用个人的github用户名来区分不同的包。

1.Go编程快速入门学习_linux_16

  • 举例说明: 张三和李四都有一个名叫studygo的项目,那么这两个包的路径就会是:
​githuab​​go get github.com/jmoiron/sqlx​​src/github.com/jmoiron/sqlx​

总结说明: 后续我们的开发学习示例基本按照第三种项目结构进行。


欢迎关注“WeiyiGeek”公众号