作为网络安全初学者,会遇到采用Go语言开发的恶意样本。因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希望大家一起进步。这系列文章入门部分将参考“尚硅谷”韩顺平老师的视频和书籍《GO高级编程》,详见参考文献,并结合作者多年的编程经验进行学习和丰富,且看且珍惜吧!后续会结合网络安全进行GO语言实战深入,加油~
这些年我学过各种编程语言,从最早的C语言到C++,再到C#、PHP、JAVA,再到IOS开发、Python,到最新的GO语言,学得是真的杂。有时候觉得编程语言恰恰是最简单的,而通过一门编程语言能够解决实际问题或深入底层才是其价值所在,并且当我们学好一门编程语言后(尤其C和C++),其他编程语言都非常类似,殊途同归,学起来也很迅速。
2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。
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语言呢?
就我而言:
学习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语言其实是Golanguage的简称,我们既然要学习Go语言,首先需要知道它能做什么事情?
下图简单展示了Golang工程师的薪资,相对还不错。
下面我们看看韩老师的Golang应用领域知识普及。
(1) 区块链应用
区块链技术简称BT(Blockchain technology)也被称为分布式账本技术,是一种互联网数据库技术,其特点是去中心化、公开透明,让每个人均可参与数据库记录。
(2) 后端服务器应用(并发)
(3) 云计算和云服务开发
首先,我先补充下我是如何怎么学习编程语言的。
不要这样学习:
应该这样学习:
Golang语言的基本学习方法和其他编程语言类似,需要注意以下几点:
该系列博客作者尽量采用通俗易懂的语言讲解,主要是结合韩顺平老师、柴老师Go语言书籍、论坛观点及作者的经验进行讲解。注重Go语言体系,同时会补充一些经典的算法问题和实战技巧(安全)。正如老师所说,在实际工作中,如何快速掌握一个技术的分享,快速学习一门技术,这种能力真的重要,这也是作者分享的另一个目的。下图展示了韩老师分享的“如何快速深入学习一个新技术”路线。
如果您关注我的博客,您应该知道我自己是一个脚踏实地学习和正能量的人,朋友圈和说说也经常发一些自己的动态去感染身边的人,包括考研、考博、找工作的朋友,如果需要这种能量可以加我微信。总之,希望您能坚持学习,做一些自己喜欢的事,学一些感兴趣的技术或混口饭吃,加油!
由于该课程尽量面向零基础的同学,所以这里简单普及下程序的基本概念知识。
(1) 什么是程序
计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
(2) 什么是指令
指令是告诉计算机从事某一特殊运算的代码。如:数据传送指令、算术运算指令、位运算指令、程序流程控制指令、串操作指令、处理器控制指令。计算机程序发给计算机处理器的命令就是“指令(instruction)”。最低级的指令是一串0和1,表示一项实体作业操作要运行(如“Add”)。根据指令类型,某个具体的存储领域被称作“寄存器(register)”,里面包含了可用于调出指令的数据或数据存储位置。
在上图中,上部分类比为程序,老板和秘书通过对话的形式进行交互。下部分是计算机实现老板布置的指令过程,计算机通过程序实现交互,程序员将main.go源码进行编译,得到一个可执行文件(二进制)main.exe,电脑再去执行操作。
Go语言是由三位大佬设计的,他们分别是Ken Thompson(肯·汤普森)、Rob Pike(罗伯·派克)和Robert Griesemer(罗伯特·格利茨默) 。
Google为什么要创造Go语言呢?
那么,能不能开发一种既兼顾编译语言的速度,又能同时拥有脚本语言的开发速度的强大语言呢?因此创造了Go语言。
Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007 年开始设计发明,设计新语言的最初的洪荒之力来自于对超级复杂的C++11特性的吹捧报告的鄙视,最终的目标是设计网络和多核时代的C语言。到2008年中期,语言的大部分特性设计已经完成,并开始着手实现编译器和运行时,大约在这一年Russ Cox作为主力开发者加入。 到了2010年,Go语言已经逐步趋于稳定,并在9月正式发布Go语言并开源了代码。下图是Go语言的基因图谱。
发布的版本信息如下所示:
Go语言很多时候被描述为“类C语言”,或者是“21世纪的C语言”。从各种角度看,Go语言确实 是从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等诸 多编程思想,还有彻底继承和发扬了C语言简单直接的暴力编程哲学等。下面是Go语言中来自贝尔实验室特有并发编程基因的演化过程:
纵观整个贝尔实验室的编程语言的发展进程,从B语言、C语言、Newsqueak、Alef、Limbo 语言一路走来,Go语言继承了来着贝尔实验室的半个世纪的软件设计基因,终于完成了C语 言革新的使命。纵观这几年来的发展趋势,Go语言已经成为云计算、云存储时代最重要的基础编程语言
Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率,使用一个表达式来形容Go语言,则如下:
说明Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发。具体特点如下:
下面先普及几个Go语言的程序,让大家感受下Go语言的魅力。首先介绍指针,go语言函数中是将变量写在前面,类型写在后面,同时Go语言后不用带分号(;)。
package main
//go语言指针的使用特点 星号取值
func testPtr(num *int) {
*num = 20
}
func main() {
}
(2) 引入包的概念,用于组织程序结构,Go语言的 一个文件都要归属于一个包,而不能单独存在。比如新建“test.go”文件,需要在一个包main中。
package main //一个go文件需要在一个包中
import “fmt”
func sayOK() {
fmt.Println(“ok”)
}
(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
}
(7) 新的创新比如切片(slice)、延时执行defer等。
常用的Go开发工具如下图所示:
官方下载地址:
建议大家先选择VSCode或Vim文本编辑器,当大家对Go语言有一定了解后,再使用Eclipse等IDE集成开发工具。这样能让你更好地理解Go语言技术和基本语法,后续更深入的理解Go语言,尤其对于初学者来说,找工作时记住一些常见的函数非常必要。
下载VScode安装软件:
它有不同版本供大家下载,Windows包括32位和64位版本,zip是压缩包,Installer需要安装;Linux中.tar.gz表示解压后就能使用64位,Mac系统只有一个下载。
作者习惯Windows系统编程,所以会选择在该环境下安装,其他操作系统建议读者可以百度解决。
直接运行EXE程序安装。这里选择安装路径:
这里建议选择勾选“添加到PATH”,环境变量能省去我们以后的很多麻烦。
安装过程如下图所示:
安装成功后打开VSCode如下图所示。
首先我们简单编写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 !")
}
同时,我们会看到右下角不断弹窗,因为这款工具功能检测到你正在做Go开发,它会提示你去安装相应的扩展包。目前我们暂时不安装相关插件,直接关掉即可。
现在我们能直接开发了吗?其实不行。写好源代码之后,我们还需要进行编译和运行源代码,因此需要搭建Go语言的开发环境,它需要SDK。
第一步,下载SDK。
SDK全称是(Software Development Kit)软件开发工具包,SDK是提供给开发人员使用的,其中包含了对应开发语言的工具包。其下载地址是Go语言的官方地址。
作者64位操作系统下载的SDK为:
第二步,解压部署SDK。
需要注意,安装路径不要在有中文或特殊符号如空格等,作者将其解压复制到如下文件夹:
其中,bin文件中的go.exe用于编译可执行文件,godoc.exe用于生产文档,dofmt.exe用于代码格式化。
第三步,测试Go语言的SDK安装成功。
注意如果返回上一层目录执行“go version”会提示错误信息,这涉及到环境变量配置问题。
第四步,配置Go环境变量。
根据Windows系统在查找可执行程序的原理,可以将Go所在路径定义到环境变量中,让系统帮我们去找到运行执行的程序,这样任何目录都可以执行go指令。配置的环境变量如下所示:
右击“我的电脑”->属性->高级系统设置->高级->环境变量->新建系统变量。
添加的环境变量如下:
重新打开DOS在运行命令,接着测试配置的环境变量是否成功。
Go程序的目录结构如下图所示:
第一步,在Goproject文件夹中创建“srcgo_code”目录,并创建第一个项目“project01”。
第二步,VSCode打开刚才创建的文件目录。
package main //把test.go文件归属到main
import "fmt" //引入包fmt
func main() {
//输出内容
fmt.Println("hello, My name is !")
}
代码解释:
第三步,通过go_build命令对该go文件进行编译,生成.exe文件
进入项目main路径下,然后“dir”查看该目录下的文件。
输入命令“go build test01.go”,发现生成exe文件。
第四步,在DOS命令行下执行.exe文件,并查看运行效果。
第五步,通过go run命令可以直接运行test01.go程序,但真实环境是需要先编译后运行的。该命令的运行时间更长,因为编译过程中隐藏在命令中,而上面的步骤是运行编译后的程序。
写到这里,这篇基础性Golang文章介绍完毕,希望您喜欢!
希望这篇基础性文章对您有帮助,写得不好的地方还请海涵。同时非常感谢参考文献中的安全大佬们的文章分享,深知自己很菜,得努力前行。也希望自己能深入下去,未来四年好好研究Go编程语言,做更多实际工程,写更好的文章,共勉!
2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。
(By:娜璋AI之家 2020-12-14 星期天 写于武汉 https://blog.csdn.net/)
参考文献: