Go基础语法¶
📚 章节概述¶
本章将介绍 Go 的基础语法,包括变量、数据类型、函数和控制流。这些是编写 Go 程序的基础。
上图梳理了本章四个核心模块:变量与常量、数据类型、函数、控制流与 defer。
🎯 学习目标¶
- 掌握变量的声明和使用
- 理解基本数据类型
- 学会定义和使用函数
- 掌握控制流语句(if、for、switch)
- 理解 defer 的使用
📖 变量与常量¶
1.1 变量声明¶
Go
// 标准声明
var name string = "Alice"
var age int = 25
// 短变量声明(推荐)
name := "Alice" // := 短变量声明,自动推断类型
age := 25
// 批量声明
var (
name string = "Alice"
age int = 25
email string = "alice@example.com"
)
1.2 常量¶
🔢 数据类型¶
2.1 基本类型¶
Go
// 整数
var i int = 42
var i8 int8 = 127
var i16 int16 = 32767
var i32 int32 = 2147483647
var i64 int64 = 9223372036854775807
// 无符号整数
var u uint = 42
var u8 uint8 = 255
// 浮点数
var f32 float32 = 3.14
var f64 float64 = 3.14159265359
// 布尔
var b bool = true
// 字符串
var s string = "Hello, Go!"
// 字符
var r rune = 'A'
2.2 类型转换¶
Go
import "strconv"
var i int = 42
var f float64 = float64(i)
var s string = "123"
var n int
n, _ = strconv.Atoi(s)
var num int = 123
var str string = strconv.Itoa(num)
📝 函数¶
3.1 函数定义¶
Go
func add(a int, b int) int {
return a + b
}
// 多返回值(需要 import "errors")
func divide(a, b int) (int, error) { // 多返回值+error,Go惯用的错误处理模式
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
3.2 可变参数¶
Go
func sum(numbers ...int) int {
total := 0
for _, num := range numbers { // range 遍历集合,返回索引和值
total += num
}
return total
}
// 使用
result := sum(1, 2, 3, 4, 5)
3.3 匿名函数和闭包¶
Go
// 匿名函数
func() {
fmt.Println("Anonymous function")
}()
// 闭包
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
add := adder()
fmt.Println(add(1)) // 1
fmt.Println(add(2)) // 3
🔄 控制流¶
4.1 if 语句¶
Go
if age >= 18 {
fmt.Println("Adult")
} else if age >= 13 {
fmt.Println("Teenager")
} else {
fmt.Println("Child")
}
// 带初始化的 if
if err := doSomething(); err != nil {
log.Fatal(err)
}
4.2 for 循环¶
Go
// 标准 for 循环
for i := 0; i < 10; i++ {
fmt.Println(i)
}
// while 循环
for i < 10 {
fmt.Println(i)
i++
}
// 无限循环
for {
// do something
if shouldBreak {
break
}
}
// 遍历切片
for index, value := range slice {
fmt.Printf("Index: %d, Value: %d\n", index, value)
}
4.3 switch 语句¶
Go
// 标准 switch
switch day {
case "Monday":
fmt.Println("Start of the week")
case "Friday":
fmt.Println("End of the week")
default:
fmt.Println("Middle of the week")
}
// 无条件的 switch
switch {
case age < 13:
fmt.Println("Child")
case age < 18:
fmt.Println("Teenager")
default:
fmt.Println("Adult")
}
4.4 defer¶
Go
func readFile(filename string) {
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
defer file.Close() // 函数结束时执行
// 读取文件
}
📝 练习题¶
练习 1:温度转换¶
Go
// TODO: 实现摄氏温度转华氏温度
func celsiusToFahrenheit(celsius float64) float64 {
// F = C × 9/5 + 32
}
func main() {
celsius := 25.0
fahrenheit := celsiusToFahrenheit(celsius)
fmt.Printf("%.2f°C = %.2f°F\n", celsius, fahrenheit)
}
练习 2:斐波那契数列¶
Go
// TODO: 生成前 n 个斐波那契数
func fibonacci(n int) []int {
}
func main() {
n := 10
fib := fibonacci(n)
fmt.Printf("前 %d 个斐波那契数: %v\n", n, fib)
}
练习 3:素数判断¶
Go
// TODO: 判断一个数是否为素数
func isPrime(n int) bool {
}
func main() {
numbers := []int{2, 3, 4, 5, 6, 7, 8, 9, 10}
for _, num := range numbers {
fmt.Printf("%d is prime: %t\n", num, isPrime(num))
}
}
💡 最佳实践¶
1. 使用短变量声明¶
2. 处理多返回值¶
Go
// 好
result, err := doSomething()
if err != nil {
log.Fatal(err)
}
// 避免
result, _ := doSomething() // 忽略错误
3. 使用 defer 清理资源¶
Go
// 好
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
// 避免
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
// 忘记关闭文件
⚠️ 常见错误¶
1. 忘记处理错误¶
Go
// 错误
file, _ := os.Open("file.txt")
// 正确
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
2. 短变量声明限制¶
3. 未使用的变量¶
Go
// 错误
name := "Alice"
age := 25 // 未使用,编译错误
// 正确
name := "Alice"
_ = name // 使用空白标识符
age := 25
_ = age // 使用空白标识符
📚 扩展阅读¶
🎯 本章小结¶
本章介绍了 Go 的基础语法:
- ✅ 掌握变量的声明和使用
- ✅ 理解基本数据类型
- ✅ 学会定义和使用函数
- ✅ 掌握控制流语句
- ✅ 理解 defer 的使用