作为网络安全初学者,会遇到采用Go语言开发的恶意样本。因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希望大家一起进步。前文介绍了什么是GO语言及为什么我要学习Golang;这篇文章将介绍Go的编译运行、语法规范、注释转义及API标准库知识。 这系列文章入门部分将参考“尚硅谷”韩顺平老师的视频和书籍《GO高级编程》,详见参考文献,并结合作者多年的编程经验进行学习和丰富,且看且珍惜吧!后续会结合网络安全进行GO语言实战深入,加油~
这些年我学过各种编程语言,从最早的C语言到C++,再到C#、PHP、JAVA,再到IOS开发、Python,到最新的GO语言,学得是真的杂。有时候觉得编程语言恰恰是最简单的,而通过一门编程语言能够解决实际问题或深入底层才是其价值所在,并且当我们学好一门编程语言后(尤其C和C++),其他编程语言都非常类似,殊途同归,学起来也很迅速。
源码下载地址:
前文参考:
- [GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
- [GO语言基础] 二.编译运行、语法规范、注释转义及API标准库知识普及
文章目录
前面我们通过VSCode已经快速编写了第一个Go程序,具体步骤如下:
- 第一步,在Goproject文件夹中创建“src\go_code”目录,并创建第一个项目“project01”。
- 第二步,VSCode打开刚才创建的文件目录。
- 第三步,通过go_build命令对该go文件进行编译,生成.exe文件。
- 第四步,在DOS命令行下执行.exe文件,并查看运行效果。
- 第五步,通过go run命令可以直接运行test01.go程序。
其运行结果如下图所示:
核心代码如下:
package main //把test.go文件归属到main
import "fmt" //引入包fmt
func main() {
//输出内容
fmt.Println("hello, My name is Eastmount!")
}
代码解释:
- 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的执行流程如下图所示:
- 编译源代码:go build指令,生成可执行文件
- 运行可执行文件:输出程序的结果
如果是对源码直接执行,通过“go run”运行程序,Go的执行流程如下图所示:
- go run将编译和运行一起执行
注意,在真实环境中是需要先编译后运行的。所以“go run”命令的运行时间更长,因为编译过程中隐藏在命令中,而上面的步骤是运行编译后的可执行文件。
“尚硅谷”韩顺平老师简单总结了两种执行流程的区别:
- 如果先编译生成了可执行文件,那么可以将该可执行文件拷贝到没有go开发环境的机器上,仍然可以运行;
- 如果我们直接运行“go run go源代码”,那么如果要在另外一个机器上运行,也需要go开发环境,否则无法执行;
- 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件变大了很多,如下图所示。
(1) 什么是编译呢?
编译(compilation , compile) 指利用编译程序从源语言编写的源程序产生目标程序的过程,Go程序的编译就是把高级语言(源码)变成计算机可以识别的二进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成二进制的。
当有了Go源文件后,通过编译器将其编译成机器可以识别的二进制文件,如下图所示,在该源文件目录下,通过“go build”对test01.go文件进行编译。
注意,“go build”编译可以指定生成的可执行文件名,但在Windows下必须是“.exe”后缀。下面简单演示下。
- go build -o eastmount.exe test01.go
- Goproject\src\go_code\project01\main
运行结果如下图所示:
- eastmount.exe
- hello, My name is Eastmount!
小技巧:在CMD中如何快速进入指定目录
打开源文件所在目录,在路径栏输入cmd+回车,即可快速进入CMD。
显示结果如下图所示:
另一种方法是在该目录下按住“Shift+鼠标右键”,点击“在此处打开PowerShell”即可。
(2) 错误提升
如果程序没有错误,没有任何提示,会在当前目录下出现一个可执行文件(Windows下是.exe文件,Linux下是一个可执行文件),该文件是二进制文件,也是可以执行的文件。如果程序有错误,编译时会在错误的那行提示,这有助于程序员调试代码。
(3) 什么是运行
运行有两种形式:
- 直接运行生成的可执行Go程序,比如test01.exe
- 通过运行工具go run对源代码文件进行运行
- Go源文件以“go”为扩展名
- Go应用程序的执行入口是main()函数,这个和其他编程语言一样(如c、java)
-
Go语言严格区分大小写
-
Go方法由一条条语句构成,每个语句后不需要分号,Go语言会在每行后自动加分号,这也体现了Golang的简洁性,和Python一样
-
Go编译器是一行行进行编译的,因此我们一行写一条语句,不能把多条语句写在同一行,否则会报错
- Go语言定义的变量或者import的包如果没有用到,代码不能编译通过
- 大括号都是成对出现的,缺一不可
(1) 如何修改字体大小?
如果我们想在VSCode中修改Go程序字体大小,则需要在设置中修改代码选项。
性能->设置->字符大小。
(2) 系统找不到指定文件。
解决方法:源文件名不存在或错误,或者路径写错误。
(3) 每次编译和运行都需要在CMD中执行吗?
作为Go初学者,我建议大家先结合CMD来执行程序,这既能了解程序的基本执行流程;又能了解CMD的常用操作,如果你是想用GO做安全或后台,这些都是非常基础的命令。当然,随着这些列文章深入,后面会分享更好的集成开发工具,那些工具中可以直接执行程序,这也是为什么Python我首先推荐大家使用官网的IDLE。
(4) 编程语法错误。
作为初学者,在编程过程中最容易犯的错误就是语法错误,GO要求必须按照语法规则编写代码。如果你的程序违反了语法规则,如忘记大括号、引号、拼写错误、变量定义未使用等,Go编译器都会提示相应的语法错误,记住:
- 尝试看懂编译器报告的语法错误
- 学会独立去谷歌或百度错误,解决错误
- 这些独立解决问题的能力更为重要,无论以后做项目、工作或科研,都将终身受益
如下图所示,在第6行没有定义“fmt.Printin”,这就是一个语法错误,正确的应该是“fmt.Println”。
Go语言常用的转义字符(escape char)如下:
- \t:表示一个制表符,通常使用它来排版
- \n:表示换行符
- \\:表示一个\
- \":表示一个"
- \r:表示一个回车,比如 fmt.Println(“Eastmount\rCSDN”)
具体实例如下所示,新建文件夹“chapter02”和“escaptechar”,接着新建“main.go”文件,并添加如下代码:
接着我们在CMD中去到指定目录,编译运行程序输出如下图所示效果:
- cd chapter02\escaptechar
- go run main.go
完整代码如下:
package main
import "fmt" //引入包fmt 提供格式化、输出、输入函数
func main() {
//转义字符
fmt.Println("Eastmount\tCSDN\tyangxiuzhang")
fmt.Println("Hello\nWorld!!!")
fmt.Println("C:\\Users\\xiuzhang\\Desktop\\data")
fmt.Println("秀璋说\"我爱娜娜\"")
//注意:回车会替换前面的内容
fmt.Println("秀璋爱娜娜\r珞珞")
fmt.Println("\a")
}
输出结果如下所示:
其他转义字符如下所示:
\a 响铃符 (相当于 \x07)
\b 退格键(BS) (相当于 \x08)
\f 换页符 (相当于 \x0C)
\t 横向制表符 (相当于 \x09)
\n 换行符 (相当于 \x0A)
\r 回车符 (相当于 \x0D)
\v 纵向制表符 (相当于 \x0B)
\123 匹配 8 進制编码所代表的字符(必须是 3 位数字)
\x7F 匹配 16 進制编码所代表的字符(必须是 3 位数字)
\x{10FFFF} 匹配 16 進制编码所代表的字符(最大值 10FFFF )
\\ 匹配字符 \
\" 匹配字符 "
注释(Comment)用于解释程序的文字,注释提高了代码的阅读性。一个程序员一定要养成良好的编程习惯,注释就是将自己的思想整理出来,再用代码去实现。注释的好处及应用场景如下:
- 当你过段时间发现程序有问题或者调整功能时
- 当你去修改别人的代码或工作交接给别人时
- 当需要补充设计文档时
- 大型团队开发项目,各个成员相互合作通过注释和接口进行协调
即使是Go语言的源代码,也包括了丰富的注释,所以养成良好的注释习惯真的很重要,尤其是初学者。通常三行代码一行注释,根据个人习惯而定。
Go语言支持C语言风格的 /* */ 块注释,也支持C++风格的 // 行注释。行注释更通用,块注释主要用于针对包的详细说明、函数功能说明或屏蔽大块的代码。
Golang两种注释如下:
- 行注释
基本语法: // 注释内容
- 块注释
基本语法:
/*
注释内容
*/
注释的使用细节:
- 对于行注释和块注释,被注释的文字不会被Go编译器执行
- 块注释里不允许有块注释嵌套
- VSCode选中代码 Ctrl+斜杠(/)会自动生成行注释,再按一次注销,IDEA通用
(1) 正确的注释和注释风格
- Go官方推荐使用行注释来注释方法和语句
- 多学习官方标准包注释
(2) 正确的缩进和空白
- 使用一次tab操作实现缩进,默认整体向右移动,恢复使用shift+tab向左移动
- 使用gofmt来进行格式化
- 运算符两边习惯个增加一个空格,比如:2 + 3 * 5
使用gofmt后自动对齐,如下图所示:
- gofmt -w test02_02.go
(3) Go语言的代码风格
正确的代码风格:
package main
import "fmt" //引入包fmt 提供格式化、输出、输入函数
func main() {
//行注释:转义字符
fmt.Println("Eastmount\tCSDN\tyangxiuzhang")
}
错误的代码风格:
- Go语言设计者认为这会导致两种标准,他们的思想是一个问题尽量只有一个解决方法。Go规定如此,大家需要按规则编写代码。
package main
import "fmt" //引入包fmt 提供格式化、输出、输入函数
func main()
{
//行注释:转义字符
fmt.Println("Eastmount\tCSDN\tyangxiuzhang")
}
(4) 一行代码最长不超过80个字符,超过请使用换行展示,尽量保持格式优雅。
Golang 官方网站如下,记住官方文档和源码永远是最好的学习场所。
当我们点击“Run”按钮即可运行程序,我们可以通过官网进行简单的代码学习。
点击“Tour”可进入编程指南,点击“packages”可查看官方标准包说明文档。
点击“Tour”编程指南显示如下图所示:
下列代码输出结果如下:
package main
import "fmt"
func main() {
fmt.Println("Hello, eastmount")
fmt.Println("CSDN")
var num = 1 + 2
fmt.Println("num=", num)
}
那么,官方文档怎么使用呢?
我们点击“简体中文”,然后看到如下图所示的Go指南。
比如我们想了解“包”的基本概念,可以点击显示如下图所示,并且有对应的示例代码。
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}
虽然这个手册对我们编程有帮助,但是其解释过于简单,对零基础的同学不太友好。但也建议大家去了解学习。
Go语言是通过包(packages)的形式来管理它的函数的,点击“packages”可查看官方标准包说明文档。
比如我们想了解import "fmt"中对应的函数及功能。我们直接在网站中查询“fmt”,点击“index”显示如下图所示:
我们想查看函数Println原型和案例,显示如下图所示:
- func Println(a …interface{}) (n int, err error)
package main
import (
"fmt"
)
func main() {
const name, age = "Kim", 22
fmt.Println(name, "is", age, "years old.")
// It is conventional not to worry about any
// error returned by Println.
}
输出结果为:
Go标准库API文档
- API(Application Programming Interface,应用程序编程接口)是Golang 提供的基本编程接口;
- Go提供了大量的标准库
- Go中文网在线标准库文档:https://studygolang.com/pkgdoc
比如搜索“fmt”,解释为“fmt包实现了格式化I/O函数,类似于C的printf和scanf”。
Go的包和源文件及函数的关系简图如下所示:
- 调用函数:import 包名
- 使用函数:包名.函数名
- Go安装src目录包含对应源码
比如作者的GO源码如下图所示:
DOS常用指令这里仅简单介绍,这是为了让大家更好地了解Windows基础操作,同时对Linux、MacOS和安全领域的命令操作也有帮助。当然,后续也会详细介绍在工具中编译运行GO程序的方法。
- DOS:Disk Operating System,磁盘操作系统,即Windows目录结构
常见命令如下:
- dir:查看当前目录
- cd 盘符:切换到其他盘符
- cd …:切换到上一级目录
- cd \:切换到根目录
- md(make directory):新建目录
新建多个目录:md test01 test02 - rd:删除目录
带询问删除目录及下面的子目录和文件:rd /s test02
- 新建一个空文件:type nul>eastmount.txt
- 新建或追加内容到文件:echo hello > eastmount.txt
- 显示文件内容:type eastmount.txt
- 复制文件并重新文件名:copy eastmount.txt d:\yxz.txt
- 移动文件:move d:\yxz.txt c:\
- 删除指定文件:del d:\yxz.txt
- 删除指定目录中txt结尾所有文件:del *.txt
- 清屏:cls
- 退出dos:exit
虽然GO语言的基本语法下一篇文章再叙述,但作者希望你们能通过搜索引擎独立解决这六个基础练习,加油!
- (1) 编写程序输出自己的名字,熟悉GO语言
- (2) 请使用一行代码输出如下内容
- (3) 编写程序实现2和3的加减乘除运算并输出结果
- (4) 编写程序获取当前时间分别输出年、月、日
- (5) 编写程序计算1+2+…+100,并输出结果
- (6) 编写程序输出如下图所示倒三角
- (1) 编写程序输出自己的名字,熟悉GO语言
package main
import "fmt"
func main() {
fmt.Println("Hi, My name is Eastmount!")
}
- (2) 请使用一行代码输出如下内容
package main
import "fmt" //引入包fmt 提供格式化、输出、输入函数
func main() {
fmt.Println("姓名\t年龄\t籍贯\t行业\nyxz\t28\t贵州\t程序员")
}
- (3) 编写程序实现2和3的加减乘除运算并输出结果
package main
import "fmt" //引入包fmt 提供格式化、输出、输入函数
func main() {
var a = 2
var b = 3
fmt.Println("a + b = ", a + b)
fmt.Println("a - b = ", a - b)
fmt.Println("a * b = ", a * b)
fmt.Println("a / b = ", a / b)
}
- (4) 编写程序获取当前时间分别输出年、月、日
package main
import (
"fmt"
"time"
)
func main() {
//获取当前日期
today := time.Now()
fmt.Println("当前日期为:", today)
//分别获取年月日
year := today.Year()
month := today.Month()
day := today.Day()
fmt.Println("年:", year)
fmt.Println("月:", month)
fmt.Println("日:", day)
fmt.Printf("%d-%02d-%02d", year, month, day)
}
补充知识:= 是赋值, := 是声明变量并赋值
// = 使用必须使用先var声明 var a a=100 var b = 100 var c int = 100 // := 是声明并赋值,并且系统自动推断类型,不需要var关键字 d := 100
- (5) 编写程序计算1+2+…+100,并输出结果
package main
import "fmt"
func main() {
var result = 0
for i := 0; i <= 100; i++ {
result += i
}
fmt.Println("1+2+...+100=", result)
}
- (6) 编写程序输出如下图所示倒三角
package main
import "fmt"
func main() {
var len = 5
for i := 0; i < len; i++ {
for j := len - i; j > 0; j-- {
fmt.Print("*")
}
fmt.Print("\n")
}
}
写到这里,这篇基础性Golang文章介绍完毕,希望您喜欢!
- 一.Go语言执行流程和编译运行
1.回顾前文
2.执行流程
3.编译运行 - 二.语法要求及常见问题
1.语法注意事项
2.常见问题 - 三.Golang转义字符、注释及编程风格
1.转义字符
2.注释
3.编程风格 - 四.Golang编程指南
1.编程指南
2.官方API标准库 - 五.Dos常用指令
1.目录操作指令
2.文件操作指令
3.其它指令 - 六.Golang编程练习
1.题目
2.解答
编程习惯和Go基本概念了解后,后面的文章将详细介绍Go语言的基础语法知识,并结合案例进行普及。希望这篇基础性文章对您有帮助,写得不好的地方还请海涵。同时非常感谢参考文献中的大佬们的文章分享,深知自己很菜,得努力前行。也希望自己能深入下去,未来四年好好研究Go编程语言,做更多实际工程,写更好的文章,共勉!
原文地址:
- https://blog.csdn.net/Eastmount/article/details/113151363
源代码下载地址:
2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。
(By:娜璋AI之家 Eastmount 2021-06-16 星期三 夜于武汉 https://blog.csdn.net/Eastmount)
参考文献: