前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[GO语言基础] 二.编译运行、语法规范、注释转义及API标准库知识普及

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

原创
作者头像
Eastmount
修改2021-02-20 09:51:54
8920
修改2021-02-20 09:51:54
举报

作为网络安全初学者,会遇到采用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程序。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其运行结果如下图所示:

在这里插入图片描述
在这里插入图片描述

核心代码如下:

代码语言:javascript
复制
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
在这里插入图片描述
在这里插入图片描述

完整代码如下:

代码语言:javascript
复制
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")
}

输出结果如下所示:

在这里插入图片描述
在这里插入图片描述

其他转义字符如下所示:

代码语言:javascript
复制
\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语言的代码风格 正确的代码风格:

代码语言:javascript
复制
package main

import "fmt" //引入包fmt 提供格式化、输出、输入函数
func main() {
	//行注释:转义字符
	fmt.Println("Eastmount\tCSDN\tyangxiuzhang")
}

错误的代码风格:

  • Go语言设计者认为这会导致两种标准,他们的思想是一个问题尽量只有一个解决方法。Go规定如此,大家需要按规则编写代码。
代码语言:javascript
复制
package main

import "fmt" //引入包fmt 提供格式化、输出、输入函数
func main()
{
	//行注释:转义字符
	fmt.Println("Eastmount\tCSDN\tyangxiuzhang")
}

(4) 一行代码最长不超过80个字符,超过请使用换行展示,尽量保持格式优雅。


四.Golang编程指南

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

1.编程指南

点击“Tour”编程指南显示如下图所示:

在这里插入图片描述
在这里插入图片描述

下列代码输出结果如下:

代码语言:javascript
复制
package main

import "fmt"

func main() {
	fmt.Println("Hello, eastmount")
	fmt.Println("CSDN")
	var num = 1 + 2
	fmt.Println("num=", num)
}
在这里插入图片描述
在这里插入图片描述

那么,官方文档怎么使用呢? 我们点击“简体中文”,然后看到如下图所示的Go指南。

在这里插入图片描述
在这里插入图片描述

比如我们想了解“包”的基本概念,可以点击显示如下图所示,并且有对应的示例代码。

代码语言:javascript
复制
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)
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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语言
代码语言:javascript
复制
package main

import "fmt"
func main() {
	fmt.Println("Hi, My name is Eastmount!")
}
  • (2) 请使用一行代码输出如下内容
代码语言:javascript
复制
package main

import "fmt"    //引入包fmt 提供格式化、输出、输入函数
func main() {
	fmt.Println("姓名\t年龄\t籍贯\t行业\nyxz\t28\t贵州\t程序员")
}
  • (3) 编写程序实现2和3的加减乘除运算并输出结果
代码语言:javascript
复制
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) 编写程序获取当前时间分别输出年、月、日
代码语言:javascript
复制
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,并输出结果
代码语言:javascript
复制
package main

import "fmt" 
func main() {
	var result = 0
	for i := 0; i <= 100; i++ {
		result += i 
	}
	fmt.Println("1+2+...+100=", result)
}
  • (6) 编写程序输出如下图所示倒三角
代码语言:javascript
复制
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-02-20 星期六 夜于贵阳 https://blog.csdn.net/Eastmount)


参考文献:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一.Go语言执行流程和编译运行
    • 1.回顾前文
      • 2.执行流程
        • 3.编译运行
        • 二.语法要求及常见问题
          • 1.语法注意事项
            • 2.常见问题
            • 三.Golang转义字符、注释及编程风格
              • 1.转义字符
                • 2.注释
                  • 3.编程风格
                  • 四.Golang编程指南
                    • 1.编程指南
                      • 2.官方API标准库
                      • 五.Dos常用指令
                        • 1.目录操作指令
                          • 2.文件操作指令
                            • 3.其它指令
                            • 六.Golang编程练习
                              • 1.题目
                                • 2.解答
                                • 七.总结
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档