作为网络安全初学者,会遇到采用Go语言开发的恶意样本。因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希望大家一起进步。这系列文章入门部分将参考“尚硅谷”韩顺平老师的视频和书籍《GO高级编程》,详见参考文献,并结合作者多年的编程经验进行学习和丰富,且看且珍惜吧!后续会结合网络安全进行GO语言实战深入
一.为什么我要学习Golang
1.Golang背景知识
Go语言其实是Golanguage的简称,Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译并发型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。该语言的吉祥物为金花鼠(gordon),如下图所示。
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go的语法接近C语言,但对于变量的声明有所不同,Go支持垃圾回收功能。Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。
官方网站:
那么,我们为什么要学习GO语言呢?
2.Why
就我而言:
学习GO语言主要是因为它在安全领域的应用,它是区块链最主流的编程语言,同时也是当前最具发展潜力的语言。它支持数据处理和大并发处理能力,能有效解决我的很多问题。Go语言是Google公司创造的语言,也是Google主推的语言。国外如Google、AWS、Cloudflare、CoreOS等,国内如七牛、阿里、小米、京东等都已经开始大规模使用Golang开发其云计算相关产品。
就你而言:
为什么你需要学习这个编程语言呢?下面我参考知乎和网上大神的答案,谈谈GO语言的优势。
-
Go 语言特色
简洁、快速、安全
并行、有趣、开源
内存管理、数组安全、编译迅速 -
Go 语言用途
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。 -
C/C++的问题:
开发效率低,对开发者要求高;libc只向后兼容,运维难度偏大。 -
Lua/Python的问题:
动态语言,缺少编译过程,低级错误频出;缺少有效的性能分析及调试工具。
作者PingCAP说到:
以下回答来自我的同事 Nick Cameron,他是 Rust 语言 Core Team 成员,因为我们的分布式数据库产品—— TiDB 的计算层是用 Go 编写的,所以他最近开始研究用 Go 语言编写程序,他从一个“编程语言设计者”的角度,分享了自己对 Go 语言优势/不足的看法。
用 Go 编程的感觉很棒。库程序里有我想要的一切,总体实现较为完善。学习体验也十分顺畅,不得不说,Go 是一种经过精心设计的实用性语言。举个例子:一旦你知悉了 Go 的语法,就能将其他语言中惯用法延续到 Go 中。只要你学会一些 Go,就可以相对轻易地推测 Go 语言的其他特性。凭借一些来自其他语言的知识,我能够阅读并理解 Go 代码,而不需要过多的搜索(Google)。与 C/C++、Java、Python 等相比,Go 并没有那么多痛点,而且更具生产力。然而,它还是与这些语言处在同一个时代。一个很好的例证是 nil:像 Rust 和 Swift 这样的语言已经去除了 null 的概念,并且消除了相关的一整类错误。Go 降低了一部分风险:没有空值(no null values),在 nil 和 0 之间进行区分。但其核心思想仍未改变,同样还会出现解空指针引用这种常见的运行时错误。
总体而言,Go 是一种简单、小巧、令人愉悦的语言。它也有一些犄角旮旯,但绝大部分是经过精心设计的。它的学习速度令人难以置信,并且规避了其他语言中一些不那么广为人知的特性。垃圾收集确实带来了一个巨大的差异:使用 GC 使得 Go 变得更简单、更小,也更容易理解。
简单介绍Go语言背景知识后,我们开始详细讲解这门语言。Let’s go!!!
二.什么是Go语言
本文详细学习了韩顺平老师的视频和柴树杉老师的《GO高级编程》,在此表示感谢,真的感谢这些大神让我们不断进步。
- https://www.bilibili.com/video/BV1pt41127FZ
- https://pan.baidu.com/s/1hYja2u-OAw-Q4OpFODBERA 提取码:yxy4
1.Golang的学习方向
Go语言其实是Golanguage的简称,我们既然要学习Go语言,首先需要知道它能做什么事情?
- 区块链研发工程师
区块链的核心思想是去中心化,让每个人都能参加数据库的记录,比如虚拟货币 - Go服务端
目前服务器端主要采用C和C++实现,只要是C和C++能做的事情,Go语言就可以实现且做的不错。因为Go的作者Ken Thompson也是C语言的设计者,相当于对C语言设计的部分优化,比如处理日志、数据打包、虚拟机处理等,据说美团后台的流量处理就是采用Go语言编写。Go语言据处理和大并发处理的能力非常突出 - 游戏软件工程师
游戏数据通道会使用Go语言 - Golang分布式/云计算软件工程师
盛大云CDN、京东分布式文件系统
下图简单展示了Golang工程师的薪资,相对还不错。
2.Golang应用领域
下面我们看看韩老师的Golang应用领域知识普及。
(1) 区块链应用
区块链技术简称BT(Blockchain technology)也被称为分布式账本技术,是一种互联网数据库技术,其特点是去中心化、公开透明,让每个人均可参与数据库记录。
(2) 后端服务器应用(并发)
- 美团后台流量支撑程序,支撑主站后台流量(排序、推荐、搜索等),提供负载均衡、cache、容错、按条件分流,统计运行指标(qps、latency)等功能。
- 仙侠道游戏,包括游戏服务端通讯、逻辑和数据存储等架构。下面推荐davyxu大佬分享的Go语言的游戏服务器底层网络库。
https://github.com/davyxu/cellnet
(3) 云计算和云服务开发
- 盛大云CDN(内容分发网络),包括CDN的调度系统、分发系统、监控系统、短域名服务,CDN内部开放平台、运营报表系统及其他一些小工具等。
PS:2019年参加极棒安全大会,清华大学利用CDN发起DDoS攻击值得安全圈的朋友去学习下,利用分发实现攻击挺有意思的。 - 京东消息推送云服务(京东云),包括京东分布式文件系统,后台服务采用Go语言实现。
三.如何学习Golang
首先,我先补充下我是如何怎么学习编程语言的。
不要这样学习:
- 只看书,不上机
- 只运行,不调试
- 只收藏,不实践,半途而废
- 只做课后练习,不做工程项目
应该这样学习:
- 多敲代码,多敲代码,多敲代码
- 多读代码,重视实战
- 良好的兴趣和信念支撑,无论是书本或视频,都坚持学到最后
- 根据自己的兴趣或者市场的需要做一些有一定规模的项目
Golang语言的基本学习方法和其他编程语言类似,需要注意以下几点:
- 高效愉快地学习
- 先建立一个整体框架,然后细节
- 在实际工作中,要培养用到什么,能够快速学习什么能力
- 先know how,再know why
- 软件编程是一门“做中学”的学科,不是会了再做,而是做了才会
- 适当的“囫囵吞枣”
- 学习软件编程是在琢磨别人怎么做,而不是我认为应该怎么做的过程,重点放在逻辑上,而不是语法本身
该系列博客作者尽量采用通俗易懂的语言讲解,主要是结合韩顺平老师、柴老师Go语言书籍、论坛观点及作者的经验进行讲解。注重Go语言体系,同时会补充一些经典的算法问题和实战技巧(安全)。正如老师所说,在实际工作中,如何快速掌握一个技术的分享,快速学习一门技术,这种能力真的重要,这也是作者分享的另一个目的。下图展示了韩老师分享的“如何快速深入学习一个新技术”路线。
如果您关注我的博客,您应该知道我自己是一个脚踏实地学习和正能量的人,朋友圈和说说也经常发一些自己的动态去感染身边的人,包括考研、考博、找工作的朋友,如果需要这种能量可以加我微信。总之,希望您能坚持学习,做一些自己喜欢的事,学一些感兴趣的技术或混口饭吃,加油!
四.程序基本概念
由于该课程尽量面向零基础的同学,所以这里简单普及下程序的基本概念知识。
(1) 什么是程序
计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
- 为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合
(2) 什么是指令
指令是告诉计算机从事某一特殊运算的代码。如:数据传送指令、算术运算指令、位运算指令、程序流程控制指令、串操作指令、处理器控制指令。计算机程序发给计算机处理器的命令就是“指令(instruction)”。最低级的指令是一串0和1,表示一项实体作业操作要运行(如“Add”)。根据指令类型,某个具体的存储领域被称作“寄存器(register)”,里面包含了可用于调出指令的数据或数据存储位置。
在上图中,上部分类比为程序,老板和秘书通过对话的形式进行交互。下部分是计算机实现老板布置的指令过程,计算机通过程序实现交互,程序员将main.go源码进行编译,得到一个可执行文件(二进制)main.exe,电脑再去执行操作。
五.Golang发展史
1.Go语言开发团队
Go语言是由三位大佬设计的,他们分别是Ken Thompson(肯·汤普森)、Rob Pike(罗伯·派克)和Robert Griesemer(罗伯特·格利茨默) 。
- Ken Thompson:主要是B语言、C语言的作者、Unix之父。1983年图灵奖(Turing Award)和1998年美国国家技术奖(National Medal of Technology)得主。他与Dennis Ritchie是Unix的原创者。Thompson也发明了后来衍生出C语言的B程序语言。
- Rob Pike:曾是贝尔实验室(Bell Labs)的Unix团队,和Plan 9操作系统计划的成员。他与Thompson共事多年,并共创出广泛使用的UTF-8 字元编码。
- Robert Griesemer:在开发Go之前是Google V8、Chubby和HotSpot JVM的主要贡献者,曾协助制作Java的HotSpot编译器,和Chrome浏览器的JavaScript引擎V8。
Google为什么要创造Go语言呢?
- 计算机硬件技术更新频繁,性能提高很快。目前主流的编程语言发展明显落后于硬件,不能合理利用多核多CPU的优势提升软件系统性能。
- 软件系统复杂度越来越高,维护成本越来越高,目前缺乏一个足够简洁高效的编程语言。现有编程语言风格不统一,计算能力不够,不能处理大并发。
- 企业运行维护很多C/C++的项目,C/C++程序运行速度虽然很快,但是编译速度却很慢,同时还存在内存泄露的一系列困扰需要解决。
那么,能不能开发一种既兼顾编译语言的速度,又能同时拥有脚本语言的开发速度的强大语言呢?因此创造了Go语言。
2.Go语言诞生历程
Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007 年开始设计发明,设计新语言的最初的洪荒之力来自于对超级复杂的C++11特性的吹捧报告的鄙视,最终的目标是设计网络和多核时代的C语言。到2008年中期,语言的大部分特性设计已经完成,并开始着手实现编译器和运行时,大约在这一年Russ Cox作为主力开发者加入。 到了2010年,Go语言已经逐步趋于稳定,并在9月正式发布Go语言并开源了代码。下图是Go语言的基因图谱。
发布的版本信息如下所示:
- 2007年,谷歌工程师开始设计一门全新的语言,这是Go语言的最初原型。
- 2009年11月10日,Google将Go语言以开放源代码的方式向全球发布。
- 2015年8月19日,Go 1.5版发布,本次更新中移除了“最后残余的C代码”,里程碑版本。
- 2017年2月17日,Go语言Go 1.8版发布。
- 2017年8月24日,Go语言Go 1.9版发布。
- 2018年2月16日,Go语言Go 1.10版发布。
Go语言很多时候被描述为“类C语言”,或者是“21世纪的C语言”。从各种角度看,Go语言确实 是从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等诸 多编程思想,还有彻底继承和发扬了C语言简单直接的暴力编程哲学等。下面是Go语言中来自贝尔实验室特有并发编程基因的演化过程:
纵观整个贝尔实验室的编程语言的发展进程,从B语言、C语言、Newsqueak、Alef、Limbo 语言一路走来,Go语言继承了来着贝尔实验室的半个世纪的软件设计基因,终于完成了C语 言革新的使命。纵观这几年来的发展趋势,Go语言已经成为云计算、云存储时代最重要的基础编程语言
3.Go语言特点
Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率,使用一个表达式来形容Go语言,则如下:
- Go = C + Python
说明Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发。具体特点如下:
- (1) 从C语言中继承了很多理念,包括表达式语法、控制结构、基础数据类型、调用参数传值、指针等等,也保留了和C语言一样的编译执行方式及弱化的指针。
下面先普及几个Go语言的程序,让大家感受下Go语言的魅力。首先介绍指针,go语言函数中是将变量写在前面,类型写在后面,同时Go语言后不用带分号(;)。
package main
//go语言指针的使用特点 星号取值
func testPtr(num *int) {
*num = 20
}
func main() {
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- (2) 引入包的概念,用于组织程序结构,Go语言的 一个文件都要归属于一个包,而不能单独存在。比如新建“test.go”文件,需要在一个包main中。
package main //一个go文件需要在一个包中
import "fmt"
func sayOK() {
fmt.Println("ok")
}
- 1
- 2
- 3
- 4
- 5
- 6
- (3) 垃圾回收机制。内存自动回收,不需要开发人员管理,防止造成内存泄露。
- (4) 天然并发性能。从语言层面支持并发,实现简单;goroutine轻量级线程,可实现大并发处理,高效利用多核;基于CPS并发模型(Communicating Sequential Process)实现。
- (5) 吸收了管道通信机制。形成Go语言特有的管道channel。通过管道channel可以实现不同的goroute之间的相互通信。
- (6) 函数可以返回多个值。
//写一个函数实现同时返回多个值
func getSumAndSub(n1 int, n2 int) (int, int) {
sum := n1 + n2 //go语言后面不用带分号
sub := n1 - n2
return sum, sub
}
- 1
- 2
- 3
- 4
- 5
- 6
- (7) 新的创新比如切片(slice)、延时执行defer等。
六.Windows系统Golang环境配置
1.开发工具
常用的Go开发工具如下图所示:
- Visual Studio Code
微软的产品,一个运行于Mac OS、Windows和Linux之上的工具,默认提供G语言的语法高亮。安装Go语言插件,还可以支持智能提示,编译运行等功能。 - Sublime Text
可以免费试用,默认也支持Go代码语法高亮,只是保存次数达到一定数量后需要购买。 - Vim
它是从vi(Linux)发展出来的一个文本编辑器,代码补全、编译及错误跳转等方便编程的功能非常丰富。 - Emacs
它不仅仅是一个编辑器,因为功能强大,可称为集成开发环境。 - Eclipse IDE工具
开源免费,并提供GoEclipse插件。 - LiteIDE
LiteIDE是一款专门为Go语言开发的跨平台轻量级集成开发环境(IDE),是国人开发的。 - JetBrains公司的产品
PhpStrom、WebStrom和PyCharm等IDE工具,都需要安装Go插件。
官方下载地址:
建议大家先选择VSCode或Vim文本编辑器,当大家对Go语言有一定了解后,再使用Eclipse等IDE集成开发工具。这样能让你更好地理解Go语言技术和基本语法,后续更深入的理解Go语言,尤其对于初学者来说,找工作时记住一些常见的函数非常必要。
2.安装VSCode
下载VScode安装软件:
它有不同版本供大家下载,Windows包括32位和64位版本,zip是压缩包,Installer需要安装;Linux中.tar.gz表示解压后就能使用64位,Mac系统只有一个下载。
作者习惯Windows系统编程,所以会选择在该环境下安装,其他操作系统建议读者可以百度解决。
- VSCodeSetup-x64-1.52.0.exe
直接运行EXE程序安装。这里选择安装路径:
- D:\Microsoft VS Code
这里建议选择勾选“添加到PATH”,环境变量能省去我们以后的很多麻烦。
安装过程如下图所示:
安装成功后打开VSCode如下图所示。
七.Golang语言快速入门
1.编写第一个Go程序
首先我们简单编写Golang程序。
第一步,创建一个文件夹用于存放Go程序,命名为“Goproject”。
第二步,选择“文件(File)”->“打开文件夹(Open Folder)”,可以看到GOPROJECT打开。
第三步,点击按钮创建一个新的文件“test01.go”。
第四步,编写最简答的代码。
package main //把test.go文件归属到main
import "fmt" //引入包fmt
func main() {
//输出内容
fmt.Println("hello, My name is Eastmount!")
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
同时,我们会看到右下角不断弹窗,因为这款工具功能检测到你正在做Go开发,它会提示你去安装相应的扩展包。目前我们暂时不安装相关插件,直接关掉即可。
2.Go语言开发环境搭建
现在我们能直接开发了吗?其实不行。写好源代码之后,我们还需要进行编译和运行源代码,因此需要搭建Go语言的开发环境,它需要SDK。
第一步,下载SDK。
SDK全称是(Software Development Kit)软件开发工具包,SDK是提供给开发人员使用的,其中包含了对应开发语言的工具包。其下载地址是Go语言的官方地址。
作者64位操作系统下载的SDK为:
- go1.15.6.windows-amd64.zip
第二步,解压部署SDK。
需要注意,安装路径不要在有中文或特殊符号如空格等,作者将其解压复制到如下文件夹:
- C:\Software\go
其中,bin文件中的go.exe用于编译可执行文件,godoc.exe用于生产文档,dofmt.exe用于代码格式化。
第三步,测试Go语言的SDK安装成功。
- cd go\bin
- dir
- go version
注意如果返回上一层目录执行“go version”会提示错误信息,这涉及到环境变量配置问题。
- 原因:当前执行的程序在当前目录下如果不存在,Windows系统会在系统中已有的一个名为path环境变量指定的目录中查找。如果仍未找到,就会出现以上的错误提示。所以需要进入go安装路径bin目录下,执行go,才会看到参数提示信息。
第四步,配置Go环境变量。
根据Windows系统在查找可执行程序的原理,可以将Go所在路径定义到环境变量中,让系统帮我们去找到运行执行的程序,这样任何目录都可以执行go指令。配置的环境变量如下所示:
右击“我的电脑”->属性->高级系统设置->高级->环境变量->新建系统变量。
添加的环境变量如下:
- 新建:GOROOT C:\Software\go
- 编辑:Path,添加“;%GOROOT%\bin”
Path环境变量系统自带,不需要新建增加内容即可;同时增加的“%GOROOT%”路径表示引用上一步添加的变量。
- GOPATH D:\Microsoft VS Code\Goproject
其中,GOPATH表示以后Go项目存放的路径,即工作目录。
重新打开DOS在运行命令,接着测试配置的环境变量是否成功。
3.Go语言程序快速运行
Go程序的目录结构如下图所示:
第一步,在Goproject文件夹中创建“src\go_code”目录,并创建第一个项目“project01”。
第二步,VSCode打开刚才创建的文件目录。
package main //把test.go文件归属到main
import "fmt" //引入包fmt
func main() {
//输出内容
fmt.Println("hello, My name is Eastmount!")
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
代码解释:
- Go程序的后缀是 .go
- Go项目结构通常采用:GOPROJECT -> src -> go_code -> 项目名称
- package main:表示test01.go文件所在包是main,在go中,每个文件都必须归属于一个包
- import “fmt”:表示引入了一个包,包名为fmt,引入该包后就能使用其函数,比如fmt.Println
- func main() {:这是一个关键字,后面对应是一个函数。main是主函数,即程序的入口。
- fmt.Println(“hello, My name is Eastmount!”):调用fmt包中函数输出内容
第三步,通过go_build命令对该go文件进行编译,生成.exe文件
进入项目main路径下,然后“dir”查看该目录下的文件。
输入命令“go build test01.go”,发现生成exe文件。
第四步,在DOS命令行下执行.exe文件,并查看运行效果。
第五步,通过go run命令可以直接运行test01.go程序,但真实环境是需要先编译后运行的。该命令的运行时间更长,因为编译过程中隐藏在命令中,而上面的步骤是运行编译后的程序。
八.总结
写到这里,这篇基础性Golang文章介绍完毕,希望您喜欢!
- 一.为什么我要学习Golang
- 二.什么是Go语言
- 三.如何学习Golang
- 四.程序基本概念
- 五.Golang发展史
- 六.Windows系统Golang环境配置
- 七.Golang语言快速入门
希望这篇基础性文章对您有帮助,写得不好的地方还请海涵。同时非常感谢参考文献中的安全大佬们的文章分享,深知自己很菜,得努力前行。也希望自己能深入下去,未来四年好好研究Go编程语言,做更多实际工程,写更好的文章,共勉!
- 读万卷书,行万里路。且行且珍惜,爱你们喔!
2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。
(By:娜璋AI之家 Eastmount 2020-12-14 星期天 写于武汉 https://blog.csdn.net/Eastmount)
参考文献:
- Go官网:https://golang.org/
- 韩老师视频:https://www.bilibili.com/video/BV1pt41127FZ
- https://www.runoob.com/go/go-tutorial.html
- https://baike.baidu.com/item/go/953521
- https://www.zhihu.com/question/21409296
- https://www.zhihu.com/question/21409296/answer/1210793633
- https://golang.org/doc/install?download=go1.15.6.windows-amd64.msi
- https://code.visualstudio.com/Download