飞道的博客

[GO语言基础] 二.编译运行、语法规范、注释转义及API标准库知识普及

183人阅读  评论(0)

作为网络安全初学者,会遇到采用Go语言开发的恶意样本。因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希望大家一起进步。前文介绍了什么是GO语言及为什么我要学习Golang;这篇文章将介绍Go的编译运行、语法规范、注释转义及API标准库知识。 这系列文章入门部分将参考“尚硅谷”韩顺平老师的视频和书籍《GO高级编程》,详见参考文献,并结合作者多年的编程经验进行学习和丰富,且看且珍惜吧!后续会结合网络安全进行GO语言实战深入,加油~

这些年我学过各种编程语言,从最早的C语言到C++,再到C#、PHP、JAVA,再到IOS开发、Python,到最新的GO语言,学得是真的杂。有时候觉得编程语言恰恰是最简单的,而通过一门编程语言能够解决实际问题或深入底层才是其价值所在,并且当我们学好一门编程语言后(尤其C和C++),其他编程语言都非常类似,殊途同归,学起来也很迅速。

源码下载地址:

前文参考:


一.Go语言执行流程和编译运行

1.回顾前文

前面我们通过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包中函数输出内容

2.执行流程

如果是对源码编译后再执行,Go的执行流程如下图所示:

  • 编译源代码:go build指令,生成可执行文件
  • 运行可执行文件:输出程序的结果

如果是对源码直接执行,通过“go run”运行程序,Go的执行流程如下图所示:

  • go run将编译和运行一起执行

注意,在真实环境中是需要先编译后运行的。所以“go run”命令的运行时间更长,因为编译过程中隐藏在命令中,而上面的步骤是运行编译后的可执行文件。

“尚硅谷”韩顺平老师简单总结了两种执行流程的区别:

  • 如果先编译生成了可执行文件,那么可以将该可执行文件拷贝到没有go开发环境的机器上,仍然可以运行;
  • 如果我们直接运行“go run go源代码”,那么如果要在另外一个机器上运行,也需要go开发环境,否则无法执行;
  • 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件变大了很多,如下图所示。


3.编译运行

(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对源代码文件进行运行


二.语法要求及常见问题

1.语法注意事项

  • Go源文件以“go”为扩展名
  • Go应用程序的执行入口是main()函数,这个和其他编程语言一样(如c、java)

  • Go语言严格区分大小写

  • Go方法由一条条语句构成,每个语句后不需要分号,Go语言会在每行后自动加分号,这也体现了Golang的简洁性,和Python一样

  • Go编译器是一行行进行编译的,因此我们一行写一条语句,不能把多条语句写在同一行,否则会报错

  • Go语言定义的变量或者import的包如果没有用到,代码不能编译通过

  • 大括号都是成对出现的,缺一不可

2.常见问题

(1) 如何修改字体大小?
如果我们想在VSCode中修改Go程序字体大小,则需要在设置中修改代码选项。

性能->设置->字符大小。

(2) 系统找不到指定文件。
解决方法:源文件名不存在或错误,或者路径写错误。

(3) 每次编译和运行都需要在CMD中执行吗?
作为Go初学者,我建议大家先结合CMD来执行程序,这既能了解程序的基本执行流程;又能了解CMD的常用操作,如果你是想用GO做安全或后台,这些都是非常基础的命令。当然,随着这些列文章深入,后面会分享更好的集成开发工具,那些工具中可以直接执行程序,这也是为什么Python我首先推荐大家使用官网的IDLE。

(4) 编程语法错误。
作为初学者,在编程过程中最容易犯的错误就是语法错误,GO要求必须按照语法规则编写代码。如果你的程序违反了语法规则,如忘记大括号、引号、拼写错误、变量定义未使用等,Go编译器都会提示相应的语法错误,记住:

  • 尝试看懂编译器报告的语法错误
  • 学会独立去谷歌或百度错误,解决错误
  • 这些独立解决问题的能力更为重要,无论以后做项目、工作或科研,都将终身受益

如下图所示,在第6行没有定义“fmt.Printin”,这就是一个语法错误,正确的应该是“fmt.Println”。


三.Golang转义字符、注释及编程风格

1.转义字符

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  ) 
\\             匹配字符 \
\"             匹配字符 "

2.注释

注释(Comment)用于解释程序的文字,注释提高了代码的阅读性。一个程序员一定要养成良好的编程习惯,注释就是将自己的思想整理出来,再用代码去实现。注释的好处及应用场景如下:

  • 当你过段时间发现程序有问题或者调整功能时
  • 当你去修改别人的代码或工作交接给别人时
  • 当需要补充设计文档时
  • 大型团队开发项目,各个成员相互合作通过注释和接口进行协调

即使是Go语言的源代码,也包括了丰富的注释,所以养成良好的注释习惯真的很重要,尤其是初学者。通常三行代码一行注释,根据个人习惯而定。

Go语言支持C语言风格的 /* */ 块注释,也支持C++风格的 // 行注释。行注释更通用,块注释主要用于针对包的详细说明、函数功能说明或屏蔽大块的代码。

Golang两种注释如下:

  • 行注释
    基本语法: // 注释内容

  • 块注释
    基本语法:
    /*
    注释内容
    */

注释的使用细节:

  • 对于行注释和块注释,被注释的文字不会被Go编译器执行
  • 块注释里不允许有块注释嵌套
  • VSCode选中代码 Ctrl+斜杠(/)会自动生成行注释,再按一次注销,IDEA通用

3.编程风格

(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编程指南

Golang 官方网站如下,记住官方文档和源码永远是最好的学习场所。

当我们点击“Run”按钮即可运行程序,我们可以通过官网进行简单的代码学习。

点击“Tour”可进入编程指南,点击“packages”可查看官方标准包说明文档。

1.编程指南

点击“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))
}

虽然这个手册对我们编程有帮助,但是其解释过于简单,对零基础的同学不太友好。但也建议大家去了解学习。


2.官方API标准库

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常用指令

DOS常用指令这里仅简单介绍,这是为了让大家更好地了解Windows基础操作,同时对Linux、MacOS和安全领域的命令操作也有帮助。当然,后续也会详细介绍在工具中编译运行GO程序的方法。

  • DOS:Disk Operating System,磁盘操作系统,即Windows目录结构

1.目录操作指令

常见命令如下:

  • dir:查看当前目录
  • cd 盘符:切换到其他盘符
  • cd …:切换到上一级目录
  • cd \:切换到根目录

  • md(make directory):新建目录
    新建多个目录:md test01 test02
  • rd:删除目录
    带询问删除目录及下面的子目录和文件:rd /s test02


2.文件操作指令

  • 新建一个空文件: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


3.其它指令

  • 清屏:cls
  • 退出dos:exit


六.Golang编程练习

1.题目

虽然GO语言的基本语法下一篇文章再叙述,但作者希望你们能通过搜索引擎独立解决这六个基础练习,加油!

  • (1) 编写程序输出自己的名字,熟悉GO语言

  • (2) 请使用一行代码输出如下内容

  • (3) 编写程序实现2和3的加减乘除运算并输出结果

  • (4) 编写程序获取当前时间分别输出年、月、日

  • (5) 编写程序计算1+2+…+100,并输出结果

  • (6) 编写程序输出如下图所示倒三角


2.解答

  • (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编程语言,做更多实际工程,写更好的文章,共勉!

源代码下载地址:

2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

(By:娜璋AI之家 Eastmount 2021-01-29 星期五 夜于贵阳 https://blog.csdn.net/Eastmount)


参考文献:


转载:https://blog.csdn.net/Eastmount/article/details/113151363
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场