Go 第一个程序
在本章中,我们将一步步创建、理解并运行你的第一个 Go 程序。这不仅是一个简单的输出练习,更是为后续探索复杂概念打下坚实的地基。
1. 创建你的第一个 Go 程序
现在,让我们马上动手写下这行著名的代码。
第一步:创建一个新文件
打开你的代码编辑器或 IDE(比如上一章配置好的 VS Code),新建一个名为 hello.go 的文件。.go 扩展名极其重要,它能明确告诉 Go 编译器这是一个 Go 语言的源代码文件。
第二步:编写代码
将以下代码原封不动地输入到你的 hello.go 文件中:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}第三步:保存文件
将文件保存在一个你容易找到的目录中(如果你配置了 GOPATH,记得暂时先保存在 GOPATH/src 目录之外的独立文件夹里)。关于正式的项目结构,我们会在后续详细探讨。
2. 逐行解析代码:程序的心脏
不要小看这短短几行代码,它包含了 Go 程序最核心的骨架。让我们逐行拆解:
package main: 这一行声明了当前代码所属的包 (Package)。在 Go 中,包是组织和复用代码的基础方式。main包是一个极其特殊的包:它是所有可执行程序的入口点。任何你想要直接运行的 Go 程序,都必须包含一个main包。你可以把它想象成应用程序启动的大门。import "fmt": 这一行导入 (Import) 了fmt包。import关键字用于引入外部包,从而让你能够使用别人写好的现成函数和类型。fmt("format" 的缩写)包提供了格式化输入和输出的功能,类似于 C 语言里的printf或 Java 里的System.out.println。func main() { ... }: 这里定义了main函数 (Function)。在main包内,main函数是程序启动时最先执行的函数。每个可执行的 Go 程序,都必须在main包中拥有一个main函数。后面的括号()表示这是一个函数,且不接收任何参数。大括号{}则包裹了该函数具体要执行的代码逻辑。fmt.Println("Hello, World!"): 这是程序的核心动作。它调用了fmt包里的Println函数。Println("Print Line" 的缩写)会将一行文本打印到控制台(标准输出)。我们要打印的文本"Hello, World!"被双引号包裹,这在编程中被称为字符串字面量 (String Literal)。
3. 运行你的 Go 程序
代码写好了,接下来让它跑起来吧!
- 打开终端或命令提示符:使用命令行工具,导航(
cd命令)到你保存hello.go文件的目录。 - 运行程序:输入
go run命令,并在后面加上你的 Go 文件名:
go run hello.go这个命令会瞬间完成代码的编译并直接运行它。你应该能在终端看到如下输出:
Hello, World!恭喜!你刚刚成功运行了你的第一个 Go 程序!
4. 深入剖析 Go 程序结构:包、导入与函数
为了让你走得更远,我们需要进一步探讨 Go 程序的三大基本组件。
4.1 包 (Packages)
- 用途:包用于将 Go 代码组织成可重用的单元。它把相关的函数、类型和变量集中在一起。这能提升代码的模块化程度,让代码更容易维护和理解。
main包:正如刚才提到的,它是程序的绝对入口。- 其他包:Go 拥有一套异常丰富的标准库(内置包),比如
fmt、os(操作系统功能)、net(网络)和http。你也可以自己创建包来梳理你的业务逻辑。 - 命名规范:包名应当简短、具有描述性,并且全小写。包名应该能直接反映包内代码的用途。
- 示例:假设你在写一个 Web 应用,你可能会有专门处理用户登录的包(
package auth)、处理数据库的包(package db)和处理路由的包(package router)。
4.2 导入 (Imports)
- 用途:
import语句用于将外部包拉取到你的程序中,这样你就能使用它们定义好的功能了。 - 一次导入多个包:如果需要引入多个包,Go 推荐使用圆括号进行批量导入,这样代码更整洁:
import (
"fmt"
"math"
)- 导入别名:如果在代码中你想给包换个简短的名字,或者为了避免不同包之间出现同名冲突,你可以使用别名:
import (
f "fmt" // 现在你可以用 f.Println 来代替 fmt.Println 了
)4.3 函数 (Functions)
- 用途:函数是执行特定任务的代码块,是 Go 程序的基础构建块。
- 声明方式:使用
func关键字,紧接着是函数名、参数列表(如果有的话)、返回值类型(如果有的话),最后是大括号{}包裹的函数体。
func add(x int, y int) int {
return x + y
}(这段代码定义了一个名为 add 的函数,接收两个整数 x 和 y,并返回它们的和,和也是一个整数)
- 调用函数:通过函数名加上括号
()来执行它。如果函数需要参数,把对应的值塞进括号里即可:
result := add(5, 3) // 调用 add 函数,传入参数 5 和 3
fmt.Println(result) // 打印出结果 (8)5. Go 的得力助手:go run 命令
go run 是日常开发中用来快速编译和执行 Go 程序的利器。
- 编译与执行二合一:
go run实际上在底层做了两步操作:首先,它把 Go 源码编译成一个可执行的二进制文件;然后,它立刻运行这个二进制文件。 - 临时文件:它生成的二进制文件通常藏在一个临时目录里,程序运行结束后就会被自动销毁。这使得
go run成为快速测试和实验的绝佳选择,不会弄脏你的工作区。 - 运行多个文件:你可以一次性把多个文件传给
go run:
go run main.go helper.goGo 会自动把它们编译在一起,文件的顺序无关紧要。
- 自动解析依赖:如果你导入了其他包,
go run极其智能,会自动找到并编译那些依赖包。 - 使用场景:在开发阶段,尽情使用
go run来验证代码修改。当你最终要把程序部署到服务器时,才会用到go build来生成永久的可执行文件。