1.3 第一个Go程序
1.3 第一个Go程序
在本节中,我们将编写并运行第一个Go程序,了解Go程序的基本结构。
Hello World
按照编程传统,我们从"Hello World"程序开始。
创建项目
-
创建项目目录:
mkdir hello-world
cd hello-world
-
初始化Go模块:
go mod init hello-world
-
创建主文件
main.go:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
运行程序
有两种方式运行Go程序:
方式一:直接运行
go run main.go
输出:
Hello, World!
方式二:编译后运行
# 编译
go build
# Windows
hello-world.exe
# Linux/macOS
./hello-world
程序结构解析
让我们逐行分析这个程序:
1. package声明
package main
-
每个Go文件都必须以
package声明开始 -
package main表示这是一个可执行程序 -
可执行程序必须有一个
main包 -
库文件使用其他包名
2. import导入
import "fmt"
-
import用于导入其他包 -
fmt是Go标准库中的格式化I/O包 -
导入的包必须被使用,否则编译报错
多个导入可以使用括号:
import (
"fmt"
"time"
"math"
)
3. main函数
func main() {
fmt.Println("Hello, World!")
}
-
func关键字用于定义函数 -
main函数是程序的入口点 -
每个可执行程序必须有且只有一个
main函数 -
main函数不接受参数,也不返回值
4. 函数调用
fmt.Println("Hello, World!")
-
fmt.Println是fmt包中的函数 -
用于打印文本并换行
-
字符串使用双引号
Go程序的基本规则
1. 文件命名
-
Go源文件以
.go为扩展名 -
文件名使用小写字母和下划线
-
例如:
main.go、user_service.go
2. 包命名
-
包名使用小写字母
-
包名应该简短且有意义
-
包名通常与目录名一致
3. 代码格式
Go有严格的代码格式规范:
// 正确:左花括号在同一行
func main() {
fmt.Println("Hello")
}
// 错误:左花括号在下一行(编译错误)
func main()
{
fmt.Println("Hello")
}
使用go fmt自动格式化代码:
go fmt main.go
4. 注释
// 单行注释
/*
多行注释
可以跨越多行
*/
// 文档注释(用于生成文档)
// Package main 是程序的入口包
package main
// main 是程序的入口函数
func main() {
fmt.Println("Hello")
}
更多示例
示例1:打印多行
package main
import "fmt"
func main() {
fmt.Println("欢迎学习Go语言!")
fmt.Println("Go是一门现代化的编程语言")
fmt.Println("让我们开始吧!")
}
示例2:使用变量
package main
import "fmt"
func main() {
message := "Hello, Go!"
fmt.Println(message)
}
示例3:格式化输出
package main
import "fmt"
func main() {
name := "张三"
age := 25
fmt.Printf("我叫%s,今年%d岁\n", name, age)
}
示例4:获取用户输入
package main
import "fmt"
func main() {
var name string
fmt.Print("请输入你的名字:")
fmt.Scanln(&name)
fmt.Printf("你好,%s!\n", name)
}
编译选项
指定输出文件名
go build -o myapp main.go
交叉编译
编译Windows可执行文件(在Linux/macOS上):
GOOS=windows GOARCH=amd64 go build -o app.exe main.go
编译Linux可执行文件(在Windows上):
set GOOS=linux
set GOARCH=amd64
go build -o app main.go
编译macOS可执行文件:
GOOS=darwin GOARCH=amd64 go build -o app main.go
减小可执行文件大小
go build -ldflags "-s -w" main.go
-
-s: 去掉符号表 -
-w: 去掉调试信息
项目结构
随着项目增长,建议使用以下结构:
myproject/
├── go.mod # 模块定义
├── go.sum # 依赖校验
├── main.go # 主程序入口
├── README.md # 项目说明
├── cmd/ # 命令行程序
│ └── myapp/
│ └── main.go
├── internal/ # 私有代码
│ ├── config/
│ └── service/
├── pkg/ # 公共库
│ └── utils/
└── test/ # 测试文件
常见错误
1. 未使用的导入
package main
import "fmt" // 错误:导入但未使用
import "time" // 错误:导入但未使用
func main() {
println("Hello")
}
解决方法:删除未使用的导入或使用下划线导入:
import _ "fmt" // 仅执行包的init函数
2. 未使用的变量
func main() {
x := 10 // 错误:声明但未使用
fmt.Println("Hello")
}
解决方法:删除未使用的变量或使用下划线:
_ = x // 明确忽略
3. 花括号位置错误
// 错误
func main()
{
fmt.Println("Hello")
}
// 正确
func main() {
fmt.Println("Hello")
}
4. 缺少package声明
// 错误:缺少package声明
import "fmt"
func main() {
fmt.Println("Hello")
}
调试技巧
1. 使用fmt.Println调试
func main() {
x := 10
fmt.Println("x的值是:", x) // 简单调试
}
2. 使用fmt.Printf格式化输出
func main() {
x := 10
fmt.Printf("x = %d, 类型 = %T\n", x, x)
}
3. 使用log包
import "log"
func main() {
log.Println("这是一条日志")
log.Printf("变量值: %d", 42)
}
4. 使用调试器
VS Code中使用Delve调试器:
-
设置断点(点击行号左侧)
-
按F5开始调试
-
使用调试控制台查看变量
练习
练习1:个人信息
编写程序输出你的个人信息:
package main
import "fmt"
func main() {
// 在这里编写代码
// 输出:姓名、年龄、城市
}
练习2:简单计算器
编写程序计算两个数的和:
package main
import "fmt"
func main() {
a := 10
b := 20
// 计算并输出a + b
}
练习3:温度转换
编写程序将摄氏度转换为华氏度:
package main
import "fmt"
func main() {
celsius := 25.0
// 公式:fahrenheit = celsius * 9/5 + 32
// 计算并输出结果
}
小结
本节我们学习了:
-
如何创建和运行第一个Go程序
-
Go程序的基本结构
-
package、import、main函数的作用
-
Go代码的基本规则和格式
-
常见错误及解决方法
-
基本的调试技巧
掌握这些基础知识后,我们就可以开始学习Go语言的语法细节了。下一节,我们将学习变量和常量。