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, 世界!

嗯,成了。就这么简单。

小提示:Go原生支持UTF-8,所以中文“世界”可以直接写,不用搞什么编码转换。这一点比某些语言友好多了。

你可能会问:为什么是 main.go?换个名字行不行?

行,但也不完全行。文件名可以随便起,但如果你想让这个文件成为程序的入口,它所在的包必须是 main,并且里面必须有一个 main 函数。这是Go的硬性规定。

2.2 Go程序结构:从外到内拆解

咱们把刚才那几行代码拆开看。一个Go源文件,从上到下大致是这么个结构:

  1. 包声明 —— 告诉编译器这个文件属于哪个包
  2. 导入声明 —— 引入需要用到的其他包
  3. 函数/变量/类型定义 —— 真正的业务逻辑

拿咱们的Hello World举例:

// 第1部分:包声明
package main

// 第2部分:导入声明
import "fmt"

// 第3部分:函数定义
func main() {
    fmt.Println("Hello, 世界!")
}

这个顺序是固定的。你不能把 import 写在 package 前面,也不能把函数定义插在中间。Go的编译器很严格,但好处是——所有Go代码长得都差不多,你随便打开一个项目,扫一眼就知道结构。

重要:Go强制要求代码风格统一。比如花括号 { 必须跟 func 在同一行,不能换行。我第一次从C语言转过来时很不习惯,但用久了发现——不用纠结代码风格了,真香。

2.3 包(package)的概念

包,说白了就是代码的组织单元。你可以把它理解成一个文件夹,里面放了一堆功能相关的Go文件。

Go里有两个特殊的包:

  • main 包 —— 可执行程序的入口包。只有 main 包才能生成可执行文件。
  • fmt 包 —— 标准库里的格式化输入输出包。我们用的 Println 就在这里面。

其他包,比如 net/httposstrings,都是标准库的一部分。你写的业务代码,也可以自己定义包。

注意:同一个目录下的所有Go文件,必须属于同一个包。你不能在 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 会自动帮你排序,不用操心顺序。

小技巧:如果你导入了包但没有使用,Go编译器会报错。这跟某些语言不一样,Go认为“没用的代码就是垃圾”。刚开始你可能觉得烦,但时间长了你会发现——代码里不会出现一堆废弃的import,干净多了。

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的编译速度——真的很快,快到让你怀疑是不是没编译。

下一章,咱们聊聊变量和数据类型。到时候我会分享一个我当年踩过的坑,跟类型推断有关……嗯,到时候再说。