diff --git a/5_FirstGoApplication.md b/5_FirstGoApplication.md new file mode 100644 index 0000000000000000000000000000000000000000..c75b8efe665bcbe4b30b20fa9622086b4de06936 --- /dev/null +++ b/5_FirstGoApplication.md @@ -0,0 +1,220 @@ +# 第五章 第一个Go应用 + +## 1.本章目标 + +- 编写一个简单的Go应用程序 +- 编译这个程序 + +### 1.1 涉及概念 + +- 规范约束 +- 编译 +- 二进制/可执行文件 + +## 2.引言 + +在这一章中,我们将会编写两个Go应用 + +## 3.规范 + +在编写代码之前,需要先确定我们的应用是用来做什么的,许多项目都是从这样开始的,因此这个阶段也叫做规范约束阶段,它旨在提供应用程序应满足的精确要求,这些要求就是规范约束。 + +本章的程序规范很简单:程序启动时打印出日期和时间,然后退出。 + +## 4.项目文件夹 + +一个Go应用是由一些文件组成的,将在这些文件里写下Go代码,我们称这些文件叫做 **源文件** 。 +一个应用被存储在一个主目录,这个主目录允许只有一个源文件,但大多数时候,会由一系列关联文件夹组成。 + +接下来我们给应用创建主目录(使用命令行或系统桌面创建皆可) + +```bin +$ cd Documents/code +$ mkdir dateAndTime +``` + +## 5.IDE + +马上就能编写代码了,但你需要一款专门的软件来写代码吗?理论上,你可以使用基础的文字编辑工具来做这件事。 +不过,有一些专门为了开发者设计的编辑软件,就是IDE(智能开发者环境) + +IDE提供了许多功能,比如: + +- 关键字高亮显示 +- 代码自动补全 +- 代码重构 +- ... + +市场上有很多IDE,你可以上Google找到最适合你的一款,我使用 IntelliJ 开发的 Goland,虽然它不是免费的(基于订阅),但我发现它非常好用。 + +## 6. 源文件 + +让我们创建一个名为 **main.go** 的源文件 + +```main.go +// first-go-application/first/main.go +package main + +import ( + "fmt" + "time" +) + +func main() { + now := time.Now() + fmt.Println(now) +} +``` + +### 6.1 代码说明 + +- 第一行在Go里是强制的,在所有源文件中,你必须添加 **package** 声明,并且声明由关键字 **package** 和包的名称组成 + +- 在第二行,你能看到另一个关键字:**import** ,它通常后跟一个左括号和程序导入包的列表,每个包都写在一个新行上,每个包都有一个由双引号分隔的名称,这里应用程序依赖于两个包: + - fmt + - time + +- 这些包都是 **标准库** 的一部分 + +- 然后你发现了一个名为 **main** 的函数声明,稍后我们将更深入地研究函数语法 + - 函数声明用大括号括起来 + - 在函数声明中,有两条语句: + - 第一条指令很明显,初始化变量 **now** ,并从 **time** 包中将函数 **Now()** 调用返回的值赋给它。 + - 第二条指令是调用 **fmt** 包中的 **Print** 函数 + - 注意!当你未使用你导入的包或者使用未导入的包时,你的 Go 程序将无法通过编译 + +``` +// DO NOT COMPILE +// first-go-application/import-issue/main.go +package main + +import ( + "fmt" + "time" +) + +func main(){ + +} +``` + +### 6.2.关于main函数 + +main函数是程序的 **入口** 。 + +在每个应用程序中,至少要有一个main函数。 + +程序将从该函数的第一条语句开始执行(在 C、C++、Java 中,存在main函数的概念)。 + +## 7. 编译 + +源文件已准备好转换为二进制文件(可执行文件),为此,我们将使用 Go 工具链。 + +打开终端: + +``` +$ cd Documents/code/dateAndTime +$ go build main.go +``` + +第一条指令 (cd) 指示 shell 将当前目录更改为 **Documents/code/dateAndTime** 。第二条命令会将程序编译为可执行文件,可执行文件名为 main(与源文件同名,不带 .go 扩展名)。 + +现在让我们看看 dateAndTime 目录下的文件: + +``` +$ ls -lh +total 4160 +-rwxr-xr-x 1 maximilienandile staff 2.0M Aug 16 11:27 main +-rw-r--r-- 1 maximilienandile staff 94B Aug 16 11:00 main.go +``` + +使用命令 **ls** (对于 Windows 用户,使用命令 **dir** ),你可以看到有两个文件: + +- **main** (可执行文件)的大小为 2.0M +- **main.go** (源文件)的大小仅为 94 Bytes + +现在是时候启动我们的应用程序了: + +``` +$ ./main +2019-08-16 11:45:44.435637 +0200 CEST m=+0.000263533 +``` + +恭喜,你的第一个 Go 应用程序运行成功了! + +## 8.本章自测 + +### 8.1本章问题 + +1. 如何编译 Go 应用程序? +2. 编译的结果如何调用? +3. Go 应用程序的入口点函数的名称是什么? +4. import语句的用途是什么? + +### 8.2本章答案 + +1. 如何编译 Go 应用程序? + 1. 打开终端 + 2. 转到你的应用程序目录。假设有一个名为 main.go 的文件,其中包含一个 main 函数,执行这些命令: + 1.$ cd /code/myApp + 2.$ go build main.go + +2. 编译的结果如何调用? + 1. 直接执行可执行文件或二进制文件 + +3. Go 应用程序的入口点函数的名称是什么? + 1. main + +4. import语句的用途是什么? + 1. 它用于将包(从标准库或其他来源)导入到程序中 + 2. 然后在代码中使用已导入的包 + +## 9.本章练习 + +### 9.1.说明 + +创建一个 go 应用程序,在屏幕上显示字符串“Hello World”并退出。 + +### 9.2.修改 + +``` +// first-go-application/hello-world/main.go +package main + +import "fmt" + +func main() { +fmt.Println("Hello World") +} +``` + +提醒: + +- 在这里你可以看到只使用了一个依赖项,程序的导入部分发生了变化,只导入一个包时不需要括号 +- 有一个主要的功能,里面有一个声明 +- 这里调用了函数 Println,这个函数是 fmt 包的一部分(fmt 表示“格式化”) +- 包 fmt 是标准库的一部分 + +## 10.本章关键 + +- 创建一个简单的程序 + - 创建文件 + - 将其命名为 **main.go** + - 这是程序的基本结构(空程序不会执行任何逻辑) + +``` +// first-go-application/skeleton/main.go +package main + +func main() { + +} +``` + +- 此文件表示为“源文件” +- 从这个源文件,可以创建一个可执行程序(可以直接启动) +- 可执行文件的创建称为“编译” +- 要编译程序,请在终端中键入以下命令 + - go build main.go +- 要启动已编译的程序,请在终端中键入以下内容: + - ./main \ No newline at end of file