不废话,直接开始。本文让你在 60 分钟内理解 Go 的核心概念,写出第一个可运行的程序。
为什么选择 Go?
Go 由 Google 开发,专为现代分布式系统和并发编程设计。三个核心特点:
- 编译快速:大型项目也能在几秒内编译完成
- 并发原生:goroutine 让并发编程变得简单
- 部署简单:编译为单个二进制文件,无依赖问题
1. 安装 Go(5 分钟)
直接下载(推荐)
访问 golang.org/dl,选择对应系统:
bash
# 验证安装
$ go version
go version go1.21.0 darwin/amd64
或者使用包管理器下载
bash
# macOS
brew install go
# Ubuntu/Debian
sudo apt install golang
# Windows (使用 Chocolatey)
choco install golang
环境配置(可选但建议)
bash
# 查看安装路径
$ which go
/usr/local/go/bin/go
# 设置工作目录(Go Modules 模式下非必需)
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
重要:Go 1.16+ 默认启用 Go Modules,无需设置 GOPATH。本文使用 Go Modules。
2. 第一个程序(10 分钟)
创建项目目录并初始化模块:
bash
mkdir hello-go && cd hello-go
go mod init hello-go
创建 main.go:
go
// main.go - Go 程序入口必须是 main 包
package main
// 导入标准库包
import "fmt"
// main 函数是程序入口
func main() {
// 打印输出
fmt.Println("Hello, Go!")
// 格式化输出
name := "World"
fmt.Printf("Hello, %s!\n", name)
}
运行程序:
bash
# 方式1:直接运行
go run main.go
# 输出: Hello, Go!
# Hello, World!
# 方式2:编译后运行
go build -o hello-app
./hello-app
3. 变量与数据类型(15 分钟)
变量声明
Go 是静态类型语言,但支持类型推断:
go
package main
import "fmt"
func main() {
// 方式1:标准声明(类型在后)
var count int = 10
// 方式2:类型推断
var message = "Hello"
// 方式3:短变量声明(函数内使用)
isReady := true
// 方式4:批量声明
var (
width = 100
height = 50
)
fmt.Printf("count: %d, message: %s, isReady: %v\n", count, message, isReady)
}
基本数据类型
Go 的数据类型简洁明确:
go
func dataTypes() {
// 整数类型
var num int = 42 // 平台相关,32或64位
var age int32 = 30 // 明确32位
var bigNum int64 = 1<<62 // 大整数
// 浮点数
var pi float64 = 3.14159
var price float32 = 19.99
// 布尔值
var isActive bool = true
// 字符串(不可变)
var greeting string = "Hello"
greeting += " Go!" // 创建新字符串
// 类型转换(必须显式)
var a int = 42
var b float64 = float64(a)
fmt.Printf("整数: %d, 浮点: %.2f, 字符串: %s\n", num, pi, greeting)
}
4. 控制结构(15 分钟)
if 语句
go
func controlFlow() {
score := 85
// 基本 if
if score >= 60 {
fmt.Println("及格")
}
// if-else
if score >= 90 {
fmt.Println("优秀")
} else if score >= 70 {
fmt.Println("良好")
} else {
fmt.Println("继续努力")
}
// if 语句中声明变量(作用域仅限于 if-else)
if limit := 100; score > limit {
fmt.Println("超过上限")
}
}
for 循环
Go 只有 for 循环,但功能强大:
go
func loops() {
// 标准 for 循环
for i := 0; i < 5; i++ {
fmt.Printf("迭代 %d\n", i)
}
// while 风格的循环
count := 0
for count < 3 {
fmt.Printf("计数: %d\n", count)
count++
}
// 无限循环
// for {
// fmt.Println("永不停止")
// }
// 遍历数组/切片
numbers := []int{10, 20, 30}
for index, value := range numbers {
fmt.Printf("索引 %d: 值 %d\n", index, value)
}
}
switch 语句
比大多数语言更灵活:
go
func switches() {
day := "Wednesday"
// 基础用法
switch day {
case "Monday":
fmt.Println("工作日开始")
case "Friday":
fmt.Println("周末快到了")
case "Saturday", "Sunday":
fmt.Println("周末")
default:
fmt.Println("普通工作日")
}
// 无表达式的 switch(替代 if-else)
hour := 14
switch {
case hour < 12:
fmt.Println("上午")
case hour < 18:
fmt.Println("下午")
default:
fmt.Println("晚上")
}
}
5. 实战:温度转换程序(10 分钟)
综合运用以上知识,写一个实用程序:
go
// temp_converter.go
package main
import (
"fmt"
"os"
"strconv"
)
// 摄氏度转华氏度
func celsiusToFahrenheit(c float64) float64 {
return c*9/5 + 32
}
// 华氏度转摄氏度
func fahrenheitToCelsius(f float64) float64 {
return (f - 32) * 5 / 9
}
func main() {
if len(os.Args) < 3 {
fmt.Println("用法: go run temp_converter.go <温度> <单位>")
fmt.Println("示例: go run temp_converter.go 25 C")
fmt.Println("示例: go run temp_converter.go 77 F")
return
}
// 解析命令行参数
tempStr := os.Args[1]
unit := os.Args[2]
// 转换为浮点数
temp, err := strconv.ParseFloat(tempStr, 64)
if err != nil {
fmt.Printf("错误: 无效的温度值 '%s'\n", tempStr)
return
}
// 根据单位转换
switch unit {
case "C", "c":
f := celsiusToFahrenheit(temp)
fmt.Printf("%.1f°C = %.1f°F\n", temp, f)
case "F", "f":
c := fahrenheitToCelsius(temp)
fmt.Printf("%.1f°F = %.1f°C\n", temp, c)
default:
fmt.Printf("错误: 未知单位 '%s' (请使用 C 或 F)\n", unit)
}
}
运行示例:
bash
# 编译运行
go run temp_converter.go 25 C
# 输出: 25.0°C = 77.0°F
go run temp_converter.go 77 F
# 输出: 77.0°F = 25.0°C
# 错误处理示例
go run temp_converter.go 25
# 输出: 用法: go run temp_converter.go <温度> <单位>
6. 核心要点总结(5 分钟)
Go 语法特点
- 类型在后 :
var name string = "Go" - 无分号:编译器自动添加(大部分情况)
- 大括号必须 :
if x > 0 { ... } - 导出规则:大写字母开头=公开,小写=私有
快速参考表
go
// 变量
x := 10 // 短声明(函数内)
var y int = 20 // 完整声明
// 常量
const Pi = 3.14
// 控制流
if x > 0 { ... }
for i := 0; i < 10; i++ { ... }
switch x { ... }
// 函数(下篇详细讲)
func add(a, b int) int {
return a + b
}
常见问题
Q: IDE推荐
A: goland(付费)B VS Code + Go 插件(免费)。
Q: 如何格式化代码?
A: 使用 gofmt:
bash
# 格式化当前目录所有 Go 文件
gofmt -w .
# 或者使用 go 命令
go fmt ./...
Q: 遇到编译错误怎么办?
A: Go 的错误信息很友好。注意:
- 未使用的变量会报错(除非用
_忽略) - 未使用的导入会报错
- 所有代码必须在包内
进阶思考:尝试修改温度转换程序,添加以下功能:
- 支持命令行标志解析(如
-c 25)- 添加帮助信息(
-h参数)- 支持批处理模式(从文件读取多个温度)
下一篇预告:Go 函数与错误处理实战------学习如何编写可复用、健壮的 Go 代码。
记住:Go 的设计哲学是"少即是多"。你刚刚学到的语法已经能解决 80% 的实际问题。