跳转至

Go基础语法

📚 章节概述

本章将介绍 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 常量

Go
const Pi = 3.14159
const MaxUsers = 100

// 批量常量
const (
    StatusActive   = 1
    StatusInactive = 0
)

🔢 数据类型

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. 使用短变量声明

Go
// 好
name := "Alice"
age := 25

// 避免
var name string = "Alice"
var age int = 25

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. 短变量声明限制

Go
// 错误
name := "Alice"
name := "Bob" // 编译错误

// 正确
name := "Alice"
name = "Bob"

3. 未使用的变量

Go
// 错误
name := "Alice"
age := 25 // 未使用,编译错误

// 正确
name := "Alice"
_ = name // 使用空白标识符
age := 25
_ = age // 使用空白标识符

📚 扩展阅读

🎯 本章小结

本章介绍了 Go 的基础语法:

  • ✅ 掌握变量的声明和使用
  • ✅ 理解基本数据类型
  • ✅ 学会定义和使用函数
  • ✅ 掌握控制流语句
  • ✅ 理解 defer 的使用

上一章: Go简介与环境搭建 | 下一章: 数组与切片