Go语言Hello, World程序

按照编程界的传统,学习一门新语言的第一步就是编写并运行"Hello, World"程序。通过这个简单的例子,你将了解Go语言的基本文件结构、代码组织方式以及编译运行流程。

前置条件:请确保你已经按照上一章完成了Go环境的安装,并且可以在终端中执行 go version 命令。

编写第一个Go程序

创建一个新的目录(例如 hello),并在其中新建一个名为 main.go 的文件。使用任何文本编辑器(VS Code、Vim、Notepad++等)输入以下代码:

文件:main.go
package main

import "fmt"

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

代码解释:

  • package main — 声明这个文件属于 main 包。在Go中,可执行程序必须包含一个 main 包,并且该包中必须有一个 main() 函数作为程序入口。
  • import "fmt" — 导入标准库中的 fmt 包,该包提供了格式化的输入输出功能,如 Println。
  • func main() { ... } — 定义 main 函数,程序从这里开始执行。左花括号 { 必须与函数声明在同一行,这是Go语言的语法要求。
  • fmt.Println("Hello, World!") — 调用 fmt 包的 Println 函数,将字符串输出到控制台并自动添加换行符。

运行程序

Go提供了两种执行方式:直接运行源码(类似解释型语言)或编译为二进制文件再执行。

方法一:go run — 直接运行

在终端中切换到 main.go 所在的目录,执行:

命令
go run main.go

你将看到输出:

Hello, World!

go run 命令会编译源码、执行生成的临时二进制文件,然后自动清理。适合开发调试阶段快速验证。

方法二:go build — 编译后执行

首先编译生成可执行文件:

go build main.go

该命令会在当前目录生成一个与源码同名的可执行文件(Windows下为 main.exe,Linux/macOS下为 main)。然后直接运行它:

# Linux/macOS
./main

# Windows
main.exe
Hello, World!

go build 适合生产部署,编译出的二进制文件没有外部依赖,可以拷贝到其他相同操作系统的机器上直接运行。

交叉编译:Go支持跨平台编译。例如在Windows上编译Linux可执行文件:set GOOS=linux&& set GOARCH=amd64&& go build main.go(Windows PowerShell语法略有不同)。这一特性使得Go非常适合微服务和云原生应用开发。

Go程序结构解析

1. 包声明(Package Declaration)
每个Go文件都必须以 package 开头,表示该文件属于哪个包。包是Go代码组织和复用的基本单位。一个目录下的所有Go文件必须声明为同一个包名(除非使用 package main_test 等特殊情况)。
2. 导入声明(Import Declaration)
使用 import 关键字导入其他包提供的功能。标准库的包位于 $GOROOT/src 中,第三方包则需要通过 go get 下载到 $GOPATH 或使用模块管理。
3. 函数定义(Function Definition)
函数使用 func 关键字定义。对于可执行程序,main 包中的 main 函数是程序入口,不接受任何参数,也没有返回值。程序退出时会返回0(正常)或非0(错误)。
4. 代码注释
Go支持单行注释 // 和多行注释 /* ... */。注释不会被编译,通常用于解释代码逻辑或生成文档。

关于 fmt 包的更多输出方式

fmt 包除了 Println 外,还有其他常用函数:

输出示例
package main

import "fmt"

func main() {
    name := "Gopher"
    age := 10

    fmt.Print("Hello, ")          // 不换行输出
    fmt.Println("World!")         // 输出并换行
    fmt.Printf("Name: %s, Age: %d\n", name, age)  // 格式化输出
}

运行以上代码将输出:

Hello, World!
Name: Gopher, Age: 10

常见错误与注意事项

  • 花括号位置错误:Go强制要求左花括号 { 与函数声明、控制语句在同一行。若换行会导致编译错误。
  • 未使用的导入:导入一个包但未使用其任何函数或变量,Go会拒绝编译(除非使用空白标识符 _)。例如仅导入 fmt 但不调用,编译将报错 imported and not used。
  • 未使用的变量:声明了变量但没有使用同样会导致编译错误。这保证了代码的整洁性。
  • 文件名无特殊要求:Go源文件必须以 .go 结尾,但文件名本身可以任意(除了测试文件以 _test.go 结尾)。main 函数所在的文件通常命名为 main.go,但并非强制。
练习:修改上面的Hello World程序,让它输出你的名字和当前日期(提示:可以使用 time.Now() 函数,需要导入 time 包)。试着用 go build 编译后,将生成的二进制文件复制到另一个目录,看看能否正常运行。

下一步学什么?

成功运行Hello World后,你已经迈出了Go语言编程的第一步。接下来的章节将深入学习Go的基础语法,包括变量、常量、数据类型、控制流(if、for、switch)和函数的高级用法。