diff --git a/chap-5-First-go-application/chapter-5.md b/chap-5-First-go-application/chapter-5.md new file mode 100644 index 0000000000000000000000000000000000000000..43511658103592a1b4c3072ca5b5f9be588912bb --- /dev/null +++ b/chap-5-First-go-application/chapter-5.md @@ -0,0 +1,215 @@ +# Chapter 5: 第一个 Go 应用程序 +![5-first-go-app.821f797f](./imgs/5-first-go-app.821f797f.jpg) +## 1 您将在本章中学到什么? +- 用 Go 写简单的程序 +- 编译 Go 代码 + +### 1.1 涵盖的技术概念 +- 目标 +- 汇编 +- 二进制文件/可执行文件 + +## 2 简介 +在本章中,我们将编写第一个 Go 应用程序。 + +## 3 应用程序的目标 +在编写代码之前,我们首先需要确定应用程序的确切目标,大多数项目都从这个阶段开始。 +在本章,我们的应用程序的目标很简单:启动时 +,应用程序应该显示日期和时间,然后退出。 + +## 4 项目目录 +Go 应用程序由一个或多个文件组成,称为“源文件”。 我们需要在这些“源文件”的中编写 Go 程序代码。 应用程序存储在主目录中,该主目录只能包含一个源文件,其他的源文件存在其他的几个子目录中。 + +首先要为应用程序创建主目录。 您可以使用命令行(或使用系统的图形界面)来执行此操作: +``` +$ cd Documents/code +$ mkdir dateAndTime +``` +## 5 集成开发环境(IDE) +我们马上就要开始写代码了。 那么问题来了,编写 Go 代码要使用特定软件吗? 答案是否定的,您可以使用任意的标准文本编辑器编写代码。 市场上有专门为开发人员开发的专用软件。 它们被称为 IDE ( Integrited Development Environment, IDE ) ,即集成开发环境。 + +IDE 提供以下功能: + +- 保留字的自动着色(语法高亮) +- 代码自动补全 +- 重构能力 +- ... + +市场上有很多 IDE 可供购买和使用。 您可以通过搜索引擎找到适合您的 IDE 。 笔者使用 IntelliJ 公司开发的 Goland 。 + 这个软件并不免费(需订阅),但功能强大易用。 + +## 6 源文件 +首先创建我们的源文件,并将其命名为 main.go + +```golang +// 该文件的目录为 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 + +- 这些包都是标准库( standard library )中的包,可以直接引用。 + +- 接着是名为 main 的函数声明。 + + - 函数声明用大括号括起来: { 和 }。 + - 在函数声明中,我们有两条语句: + + - 第一条语句的作用是赋值。我们初始化变量 "now" ,并赋予它从包 time 中调用 Now() 函数所返回的值。 + - 第二条语句的作用是调用 fmt 包中的 Print 函数 + +- 警告!与其他程序有所区别的是,请确保您真的要使用这个包才导入它。当您使用未导入的包时,您的 Go 程序将无法编译,但是如果您导入了包却没有使用这个包时,Go 程序同样无法编译。 + +```golang +// 不要编译这段代码 +// first-go-application/import-issue/main.go +package main + +import ( + "fmt" + "time" +) + +func main(){ + +} +``` + +### 6.2 关于 main 函数 +main 函数是程序的入口。 在每个应用程序中至少要有一个 main 函数。 程序将从 main 函数的第一条语句开始运行。 (请注意,在 C、C++、Java 中,同样存在 main 函数的概念)。 + +## 7 编译 +现在源代码已经可以被编译成二进制程序了,为此我们需要使用 Go 的一些工具,打开命令框,输入如下的指令 +``` +$ cd Documents/code/dateAndTime +$ go build main.go +``` + +第一条指令 cd 表示将当前目录更改为 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.0 MB。 +- 源文件 main.go 的体积仅为 94 B。 + +现在可以启动我们的应用程序了: + +``` +$ ./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 函数,使用一下的命令: + ``` + $ cd /code/myApp + + $ go build main.go + ``` + +2. 编译的结果是什么? + + - 得到可执行文件或二进制文件 + +3. Go 应用程序的入口函数是什么? + + - main + +4. import 语句的作用是什么? + + - 用于将标准库或其他来源的包进行导入,然后就可以在代码中使用导入的包。 + +## 9 练习 +### 9.1 目标 +创建一个 Go 应用程序,在屏幕上显示字符串 "Hello World" 并退出。 + +### 9.2 改错 +```golang +// first-go-application/hello-world/main.go +package main + +import "fmt" + +func main() { + fmt.Println("Hello World") +} +``` + +注意事项: + +- 在这里您可以看到我们只使用了一个导入包,所以导入部分发生了变化; 只导入一个包时不需要括号。 + +- main 函数里面有一条语句。 + +- 这里调用的 Println 函数是 fmt 包的一部分(fmt 代表“格式化”,是 format 的简写)。 + +- 包 fmt 是标准库的一部分。 + +## 10 关键要点 +- 要创建一个简单的程序,需如下的步骤: + + - 创建文件 + + - 将其命名为 main.go + + - 以下是程序的基本框架(这段代码没有实现任何功能) + + ```golang + // first-go-application/skeleton/main.go + package main + + func main() { + + } + ``` + +- 此文件为“源文件” + +- 从这个源文件,我们可以创建一个可执行程序。 + +- 可执行文件的创建过程称为“编译”。 + +- 要编译程序,请在终端中输入以下命令 + ``` + $ go build main.go + ``` + +- 要启动已编译的程序,请在终端中输入以下内容: + ``` + $ ./main + ``` \ No newline at end of file diff --git a/chap-5-First-go-application/imgs/5-first-go-app.821f797f.jpg b/chap-5-First-go-application/imgs/5-first-go-app.821f797f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..333a96cbd1051802c6f6ecf5d3d5ed65d54169ac Binary files /dev/null and b/chap-5-First-go-application/imgs/5-first-go-app.821f797f.jpg differ