2、Go基础语法:第一个Go程序(Hello World)、Go程序结构、包(package)的概念、import导入路径、main函数
好,咱们正式开始写代码了。
说实话,每次带新人入门Go,我最怕的就是一上来就讲一堆理论。语法树、编译原理什么的,听着就头大。我的习惯是——先跑起来,再慢慢理解。
所以这一章,咱们的目标很简单:写出你的第一个Go程序,并且搞懂它每一行到底在干嘛。
2.1 第一个Go程序:Hello World
打开你的编辑器,新建一个文件,叫 main.go。然后敲下这段代码:
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界!")
}
保存,然后在终端里执行:
go run main.go
你会看到输出:
Hello, 世界!
嗯,成了。就这么简单。
你可能会问:为什么是 main.go?换个名字行不行?
行,但也不完全行。文件名可以随便起,但如果你想让这个文件成为程序的入口,它所在的包必须是 main,并且里面必须有一个 main 函数。这是Go的硬性规定。
2.2 Go程序结构:从外到内拆解
咱们把刚才那几行代码拆开看。一个Go源文件,从上到下大致是这么个结构:
- 包声明 —— 告诉编译器这个文件属于哪个包
- 导入声明 —— 引入需要用到的其他包
- 函数/变量/类型定义 —— 真正的业务逻辑
拿咱们的Hello World举例:
// 第1部分:包声明
package main
// 第2部分:导入声明
import "fmt"
// 第3部分:函数定义
func main() {
fmt.Println("Hello, 世界!")
}
这个顺序是固定的。你不能把 import 写在 package 前面,也不能把函数定义插在中间。Go的编译器很严格,但好处是——所有Go代码长得都差不多,你随便打开一个项目,扫一眼就知道结构。
{ 必须跟 func 在同一行,不能换行。我第一次从C语言转过来时很不习惯,但用久了发现——不用纠结代码风格了,真香。
2.3 包(package)的概念
包,说白了就是代码的组织单元。你可以把它理解成一个文件夹,里面放了一堆功能相关的Go文件。
Go里有两个特殊的包:
main包 —— 可执行程序的入口包。只有main包才能生成可执行文件。fmt包 —— 标准库里的格式化输入输出包。我们用的Println就在这里面。
其他包,比如 net/http、os、strings,都是标准库的一部分。你写的业务代码,也可以自己定义包。
src/ 目录下放一个 package main,又在同一个目录下放一个 package utils。编译器会报错。我曾经因为这个坑,排查了半小时……
2.4 import导入路径
import "fmt" 这行,意思就是“我要用fmt包里的东西”。
导入路径的规则其实很简单:
- 标准库:直接写包名,比如
"fmt"、"net/http"、"os" - 第三方包:写完整的模块路径,比如
"github.com/gin-gonic/gin" - 本地包:写相对于模块根目录的路径,比如
"myproject/utils"
如果你需要导入多个包,可以这样写:
import (
"fmt"
"os"
"time"
)
我个人习惯用这种分组写法,看起来清爽。而且Go的格式化工具 gofmt 会自动帮你排序,不用操心顺序。
2.5 main函数:程序的起点
func main() 是每个Go程序的入口函数。程序启动时,会先执行 main 包里的 main 函数。
关于 main 函数,有几点要注意:
- 没有参数:
main函数不接受任何参数。如果你想获取命令行参数,用os.Args。 - 没有返回值:
main函数不返回任何值。程序退出码通过os.Exit控制。 - 只能有一个:同一个
main包里,只能有一个main函数。
举个例子,如果你想获取命令行参数:
package main
import (
"fmt"
"os"
)
func main() {
// os.Args[0] 是程序名,os.Args[1:] 是真正的参数
fmt.Println("Hello,", os.Args[1])
}
运行:
go run main.go 小明
// 输出:Hello, 小明
- Go程序从
main包的main函数开始执行 - 每个Go文件都必须属于某个包
- 导入路径决定了你能用哪些功能
- 代码结构固定:包声明 → 导入 → 代码
好了,这一章的内容就这么多。你不需要记住所有细节,先动手把Hello World跑起来,感受一下Go的编译速度——真的很快,快到让你怀疑是不是没编译。
下一章,咱们聊聊变量和数据类型。到时候我会分享一个我当年踩过的坑,跟类型推断有关……嗯,到时候再说。