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

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

源码下载地址:

  • https://github.com/eastmountyxz/Go-learning

前文参考:

  • [GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
  • [GO语言基础] 二.编译运行、语法规范、注释转义及API标准库知识普及

文章目录

  • 一.Go语言执行流程和编译运行
    • 1.回顾前文
    • 2.执行流程
    • 3.编译运行
  • 二.语法要求及常见问题
    • 1.语法注意事项
    • 2.常见问题
  • 三.Golang转义字符、注释及编程风格
    • 1.转义字符
    • 2.注释
    • 3.编程风格
  • 四.Golang编程指南
    • 1.编程指南
    • 2.官方API标准库
  • 五.Dos常用指令
    • 1.目录操作指令
    • 2.文件操作指令
    • 3.其它指令
  • 六.Golang编程练习
    • 1.题目
    • 2.解答
  • 七.总结

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

1.回顾前文

前面我们通过VSCode已经快速编写了第一个Go程序,具体步骤如下:

  • 第一步,在Goproject文件夹中创建“src\go_code”目录,并创建第一个项目“project01”。
  • 第二步,VSCode打开刚才创建的文件目录。
  • 第三步,通过go_build命令对该go文件进行编译,生成.exe文件。
  • 第四步,在DOS命令行下执行.exe文件,并查看运行效果。
  • 第五步,通过go run命令可以直接运行test01.go程序。

其运行结果如下图所示:

核心代码如下:

package main    //把test.go文件归属到mainimport "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 mainimport "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 mainimport "fmt" //引入包fmt 提供格式化、输出、输入函数
func main() {//行注释:转义字符fmt.Println("Eastmount\tCSDN\tyangxiuzhang")
}

错误的代码风格:

  • Go语言设计者认为这会导致两种标准,他们的思想是一个问题尽量只有一个解决方法。Go规定如此,大家需要按规则编写代码。
package mainimport "fmt" //引入包fmt 提供格式化、输出、输入函数
func main()
{//行注释:转义字符fmt.Println("Eastmount\tCSDN\tyangxiuzhang")
}

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


四.Golang编程指南

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

  • https://golang.org

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

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

1.编程指南

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

  • https://tour.golang.org/welcome/1

下列代码输出结果如下:

package mainimport "fmt"func main() {fmt.Println("Hello, eastmount")fmt.Println("CSDN")var num = 1 + 2fmt.Println("num=", num)
}

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

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

package mainimport ("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 mainimport ("fmt"
)func main() {const name, age = "Kim", 22fmt.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 mainimport "fmt"
func main() {fmt.Println("Hi, My name is Eastmount!")
}
  • (2) 请使用一行代码输出如下内容
package mainimport "fmt"    //引入包fmt 提供格式化、输出、输入函数
func main() {fmt.Println("姓名\t年龄\t籍贯\t行业\nyxz\t28\t贵州\t程序员")
}
  • (3) 编写程序实现2和3的加减乘除运算并输出结果
package mainimport "fmt"    //引入包fmt 提供格式化、输出、输入函数
func main() {var a = 2var b = 3fmt.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 mainimport ("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 mainimport "fmt"
func main() {var result = 0for i := 0; i <= 100; i++ {result += i }fmt.Println("1+2+...+100=", result)
}
  • (6) 编写程序输出如下图所示倒三角
package mainimport "fmt"
func main() {var len = 5for 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://github.com/eastmountyxz/Go-learning

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

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


参考文献:

  • Go官网:https://golang.org/
  • 韩老师视频:https://www.bilibili.com/video/BV1pt41127FZ
  • https://www.runoob.com/go/go-tutorial.html
  • Go中文网在线标准库文档:https://studygolang.com/pkgdoc

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

  1. JavaScript语言基础(二)

    一.之前介绍了JavaScript语言基础的关键字.标识符.常用的数据类型,文章地址:JavaScript语言基础(一) ,下面来介绍JavaScript基础中的常量和变量. 1.常量:当程序运行时, ...

  2. 在ubuntu系统下使用gcc和makefile实现c语言程序的编译运行

    目录 前言 一.使用gcc命令完成编译c语言程序 1.编写c语言程序 main1.c sub1.h sub1.c 2.gcc命令编译 步骤一命令:gcc -c sub1.c作用:将sub1.c程序转换 ...

  3. 如何用vscode实现c语言代码快速编译运行(适合初学者)

    目录 1.下载mingw64 2.配置环境变量 3.打开Vscode安装code runner扩展 本人刚开始学习C语言,发现Dev-c++纵然编译运行方便,但其代码联想功不够智能,界面也非常单调.在 ...

  4. 【五】 C语言基础知识学习回顾 | 一篇搞定C语言基础 | 内附详细代码以及注释

    一 .C语言学习第一天 1.1 编写C语言代码:hello.c #include<stdio.h> #include<stdlib.h> //调用system系统函数需要包含的 ...

  5. Python程序设计与科学计算精录总结Episode.3 Python高级语法:文件、异常、标准库和问题解决模式知识总结(基于Michael导师Python课程与VS2019)

    今天是2020年5月20日,这个对于博主来说平凡的一天,但社交媒体上早就炸开锅了. 博主认为,有些人受过伤之后,就爱的小心翼翼,迟迟不敢去再次追求自己的另一半,就这样,渐渐的过了能够大胆去爱的年纪,一 ...

  6. ps 2c语言程序,C语言基础(二)

    ## #ifdef的形式 预处理程序提供了条件编译的功能.条件编译有三种形式,下面分别介绍. 第一种形式 第一种形式的格式为: ```#ifdef 标识符 程序段1 #else 程序段2 #endif ...

  7. c语言中通过指针引用数组,C语言基础(二)

    指针引用数组 C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素. 引入指针变量后,就可以用两种方法来访问数组元素了.如果p的初值为&a[0],则: p+i和 ...

  8. C语言基础学习教程基本语法

    C 的令牌(Token) C 程序由各种令牌组成,令牌可以是关键字.标识符.常量.字符串值,或者是一个符号.例如,下面的 C 语句包括五个令牌: printf("Hello, World! ...

  9. python语言中整数1010的二进制表示_爱校码 - Python 语言基础二

    Python中基本的数据类型有Number(数字).String(字符串).List(列表).Tuple(元组).Dictionary(字典).Set(集合)等. 用type()可以查看变量和常量的数 ...

最新文章

  1. 自由主义者的周一和周五
  2. ucos中的三种临界区管理机制
  3. 需求分析与建模最佳实践_社交媒体和主题建模:如何在实践中分析帖子
  4. C#中对泛型List进行分组输出元素
  5. python中dlib库_python 基于dlib库的人脸检测的实现
  6. QT5 C++编写B类IP地址计算第一个可用IP地址、最后一个可用IP地址、网络号、广播地址、子网数、主机数
  7. C#判断指定文件是否存在
  8. c中的结构体嵌套问题_C中的结构
  9. One Switch for Mac(系统功能快速切换工具)
  10. access 导入 txt sql语句_从零开始学 MySQL - 数据库的导入导出和备份
  11. 我们自研的那些Devops工具
  12. Linux下安装gcc报错的情况解决方案
  13. 《Android框架揭秘》——2.6节小结
  14. [乙女向]金色琴弦2f 安可[PSP汉化版][带完美存档+文档攻略+金手指]
  15. Levenberg-Marquardt(LM算法)
  16. App山寨疯狂 爱加密Apk加密平台防破解
  17. win10在哪里找到计算机,win10计算器在哪里?win10怎么调出计算器?
  18. java中string的方法_Java中String常用方法
  19. 网站被攻击的常见形式
  20. 数据库学习-关于存在量词exists的理解

热门文章

  1. LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
  2. SQL基础【九、Update】
  3. 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN
  4. Oracle ASM 进程之ASMB
  5. 在LINUX上配置oracle ASMLib的多路径磁盘
  6. shell 调用 sqlplus 各种情况示例
  7. Oracle 分区表(一)
  8. 整型数据在内存中的存放形式
  9. HDU 1159 Common Subsequence
  10. 线程对象Android 开发之多线程处理、Handler 详解