第一个 Go 程序

环境搭建完成后,让我们来编写第一个 Go 程序——经典的 "Hello World"。通过这个简单的程序,你将了解 Go 程序的基本结构。

创建项目

创建项目目录

首先,创建一个存放代码的目录:

Windows:

mkdir %USERPROFILE%\go\src\hello
cd %USERPROFILE%\go\src\hello

macOS/Linux:

mkdir -p ~/go/src/hello
cd ~/go/src/hello

初始化模块

Go 1.11 引入了模块(Module)管理,我们使用 go mod init 初始化:

go mod init hello

这会创建一个 go.mod 文件,用于管理依赖:

module hello

go 1.22

编写代码

创建 main.go 文件

在项目目录下创建 main.go 文件,输入以下代码:

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

代码详解

让我们逐行分析这段代码:

第 1 行:package main

package main
  • package 关键字用于声明包名
  • main 是一个特殊的包名,表示这是一个可执行程序
  • 每个 Go 文件必须属于一个包

第 3 行:import "fmt"

import "fmt"
  • import 关键字用于导入其他包
  • fmt 是 Go 标准库中的格式化输入输出包
  • fmt.Println 用于打印输出

第 5 行:func main()

func main() {
    // 函数体
}
  • func 关键字用于定义函数
  • main 是一个特殊的函数名,是程序的入口点
  • 程序从 main 函数开始执行

第 6 行:fmt.Println("Hello, World!")

fmt.Println("Hello, World!")
  • 调用 fmt 包的 Println 函数
  • 输出字符串 "Hello, World!"
  • Println 会自动在末尾添加换行符

完整结构图

┌─────────────────────────────────────┐
│  package main                       │ ← 包声明
├─────────────────────────────────────┤
│  import "fmt"                       │ ← 导入包
├─────────────────────────────────────┤
│  func main() {                      │ ← 主函数
│      fmt.Println("Hello, World!")   │ ← 函数体
│  }                                  │
└─────────────────────────────────────┘

运行程序

使用 go run

go run 命令用于编译并运行 Go 程序:

go run main.go

输出:

Hello, World!

go run 的工作流程:

源代码 → 编译 → 临时可执行文件 → 运行 → 输出结果

使用 go build

go build 命令用于编译程序,生成可执行文件:

go build

这会在当前目录生成一个可执行文件:

  • Windows:hello.exe
  • macOS/Linux:hello

然后运行这个可执行文件:

Windows:

.\hello.exe

macOS/Linux:

./hello

输出:

Hello, World!

go run vs go build

命令说明适用场景
go run编译并运行,不保留可执行文件开发调试
go build编译生成可执行文件发布部署

进阶:更多输出方式

fmt.Print

fmt.Print 输出不换行:

package main

import "fmt"

func main() {
    fmt.Print("Hello, ")
    fmt.Print("World!")
}

输出:

Hello, World!

fmt.Println

fmt.Println 输出后自动换行:

package main

import "fmt"

func main() {
    fmt.Println("Hello")
    fmt.Println("World")
}

输出:

Hello
World

fmt.Printf

fmt.Printf 支持格式化输出:

package main

import "fmt"

func main() {
    name := "张三"
    age := 25
    fmt.Printf("姓名: %s, 年龄: %d\n", name, age)
}

输出:

姓名: 张三, 年龄: 25

常用格式化动词:

动词说明示例
%s字符串"hello"
%d整数123
%f浮点数3.14
%t布尔值true
%v通用格式任意类型
%T类型int, string
%p指针0xc0000...
\n换行-

多文件项目

实际项目中,代码通常分布在多个文件中。

示例:两数相加

项目结构:

calc/
├── go.mod
├── main.go
└── calc.go

calc.go:

package main

func Add(a, b int) int {
    return a + b
}

main.go:

package main

import "fmt"

func main() {
    result := Add(10, 20)
    fmt.Printf("10 + 20 = %d\n", result)
}

运行:

go run .

或:

go run main.go calc.go

输出:

10 + 20 = 30

代码规范

Go 语言有严格的代码规范,使用 go fmt 工具可以自动格式化代码:

go fmt main.go

常见规范

规范说明
缩进使用 Tab 缩进
大括号左大括号不能单独一行
命名驼峰命名法,首字母大写表示公开
导入未使用的包必须删除

错误示例

// 错误:左大括号单独一行
func main()
{
    fmt.Println("Hello")
}

正确示例

// 正确:左大括号在同一行
func main() {
    fmt.Println("Hello")
}

常见错误

错误 1:undefined: fmt

package main

func main() {
    fmt.Println("Hello")
}

错误信息:

./main.go:4:2: undefined: fmt

原因:没有导入 fmt 包。

解决方法

import "fmt"

错误 2:imported and not used

package main

import "fmt"
import "os"

func main() {
    fmt.Println("Hello")
}

错误信息:

./main.go:3:8: imported and not used: "os"

原因:导入了 os 包但没有使用。

解决方法:删除未使用的导入。

错误 3:syntax error

package main

import "fmt"

func main()
{
    fmt.Println("Hello")
}

错误信息:

./main.go:5:6: syntax error: unexpected semicolon or newline before {

原因:左大括号不能单独一行。

解决方法:将左大括号移到函数声明同一行。

总结

本章我们完成了第一个 Go 程序,学习了:

知识点说明
package main声明可执行程序的包
import导入其他包
func main()程序入口函数
go run编译并运行程序
go build编译生成可执行文件
fmt.Println输出字符串并换行
go fmt格式化代码