第2章 - Hello World
嘿,朋友们!
经典的第一个程序来了!通过Hello World,我来带你了解Go程序的基本结构。说实话,我第一次看到Go的Hello World时,真的被它的简洁惊艳到了——原来代码可以这么干净!这和Java的冗长完全不同,让我这个自学的菜鸟也能快速上手。
🛠️ 创建项目
# 创建项目目录
mkdir hello-world
cd hello-world
# 初始化模块(类似 npm init)
go mod init hello-world
✍️ 编写代码
创建 main.go:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
🚀 运行程序
go run main.go
输出:
Hello, World!
🔍 代码解析
让我们逐行理解:
package main // 1. 包声明
每个Go文件必须以 package 声明开头。main 是特殊的包名,表示这是一个可执行程序。
对比其他语言
// Java没有显式的包声明(可选)
// JavaScript没有包的概念,用模块代替
import "fmt" // 2. 导入包
fmt 是Go标准库的格式化包,提供打印功能。类似Java的 import java.util.*;
func main() { // 3. main函数
// ...
}
程序入口,Go程序从 main 包的 main() 函数开始执行。
注意大括号
Go强制要求 { 必须和函数名在同一行!下面的写法会报错:
func main()
{ // ❌ 编译错误
}
fmt.Println("Hello, World!") // 4. 打印输出
调用 fmt 包的 Println 函数。注意:
- 函数名首字母大写
Println(Go的导出规则) - 自动换行(类似 Java 的
System.out.println)
🎯 对比:Java vs Go vs JavaScript
同样的Hello World,三种语言:
Java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
JavaScript:
console.log("Hello, World!");
Go:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Go的代码量介于两者之间,既不像Java那么啰嗦,又比JS多了类型安全。
⚙️ 编译 vs 运行
直接运行
go run main.go
go run 会编译并立即运行,适合开发调试。
编译成可执行文件
# 编译
go build main.go
# Windows 生成 main.exe
# Linux/Mac 生成 main(无后缀)
# 运行
./main # Linux/Mac
main.exe # Windows
交叉编译(超方便!)
在Windows上编译Linux可执行文件:
SET GOOS=linux
SET GOARCH=amd64
go build main.go
这是Go的一大优势:一次编写,到处编译!
📁 多个文件的项目
当项目有多个文件时:
hello-world/
├── main.go
├── utils.go
└── go.mod
utils.go:
package main
func sayHello(name string) string {
return "Hello, " + name + "!"
}
main.go:
package main
import "fmt"
func main() {
message := sayHello("Go")
fmt.Println(message)
}
运行整个项目:
go run .
# 或
go run main.go utils.go
📚 fmt包常用函数
fmt 包很常用,记住这几个:
package main
import "fmt"
func main() {
name := "张三"
age := 18
// Println - 打印并换行
fmt.Println("Hello", name) // Hello 张三
// Printf - 格式化打印(类似C语言)
fmt.Printf("姓名: %s, 年龄: %d\n", name, age) // 姓名: 张三, 年龄: 18
// Sprintf - 格式化返回字符串
info := fmt.Sprintf("%s今年%d岁", name, age)
fmt.Println(info) // 张三今年18岁
// Print - 打印不换行
fmt.Print("不换行")
fmt.Print("还是这一行\n")
}
常用格式化占位符:
| 占位符 | 说明 | 示例 |
|---|---|---|
%s | 字符串 | "hello" |
%d | 整数 | 123 |
%f | 浮点数 | 3.14 |
%t | 布尔值 | true |
%v | 任意类型(万能) | 自动推断 |
%+v | 带字段名的结构体 | {Name:张三} |
%T | 打印类型 | int |
💪 练习
试着修改代码,完成以下练习:
- 打印你的名字
- 打印一首古诗(多行)
- 使用
Printf格式化打印你的年龄
参考答案
package main
import "fmt"
func main() {
// 1. 打印名字
fmt.Println("我的名字是小明")
// 2. 打印古诗
fmt.Println("静夜思")
fmt.Println("床前明月光,")
fmt.Println("疑是地上霜。")
fmt.Println("举头望明月,")
fmt.Println("低头思故乡。")
// 3. 格式化打印
name := "小明"
age := 20
fmt.Printf("%s今年%d岁\n", name, age)
}
太棒了!你已经写出了第一个Go程序。下一节我们来学习变量与常量!
