Go 基本语法|青训营

84 阅读3分钟

Go语言的基本语法和c/c++ java等编程语言相类似,底层逻辑是互通的

  1. 包声明:  每个Go程序都由一个或多个包组成,包声明在文件的开头。package 关键字用于声明包名。

    package main
    
  2. 导入语句:  使用 import 关键字导入其他包,以便在程序中使用其功能。

    import "fmt"
    
  3. 函数声明:  使用 func 关键字声明函数。main 函数是程序的入口点。

    func main() {
        // 代码...
    }
    
  4. 变量声明:  使用 var 关键字声明变量,指定变量名和类型。

    var age int
    
  5. 短变量声明:  使用 := 运算符可以在声明变量的同时进行赋值。

    name := "Alice"
    
  6. 数据类型:  Go具有基本的数据类型,如整数、浮点数、字符串、布尔等。

    var num int = 42
    var price float64 = 9.99
    var message string = "Hello, World!"
    var isTrue bool = true
    
  7. 常量:  使用 const 关键字声明常量。

    const pi = 3.14159
    
  8. 流程控制:  Go使用 ifelseswitch 和 for 等关键字来实现流程控制。使用条件控制语句时,判断条件不需要加括号

    if age >= 18 {
        fmt.Println("You are an adult.")
    } else {
        fmt.Println("You are a minor.")
    }
    
    switch day {
        case "Monday":
            fmt.Println("It's Monday.")
        case "Tuesday":
            fmt.Println("It's Tuesday.")
        default:
            fmt.Println("It's another day.")
    }
    
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
    
  9. 数组和切片:  使用数组和切片来存储一系列相同类型的数据。

    var numbers [5]int
    numbers[0] = 1
    numbers[1] = 2
    
    var fruits = []string{"apple", "banana", "orange"}
    
  10. 结构体:  使用 struct 关键字定义自定义的数据结构。

    type Person struct {
        FirstName string
        LastName  string
        Age       int
    }
    
  11. 指针:  使用指针来存储变量的内存地址,使用方式和c/c++相类似。

    var x int = 10
    var ptr *int = &x
    
  12. 函数:  可以声明和调用函数,函数可以有参数和返回值。

    func add(a, b int) int {
        return a + b
    }
    
  13. 方法:  Go支持在自定义类型上定义方法。

    type Rectangle struct {
        width  int
        height int
    }
    
    func (r Rectangle) area() int {
        return r.width * r.height
    }
    
  14. 包和可见性:  Go中的标识符的可见性是通过首字母大小写来确定的。大写字母开头的标识符是可导出的,可以在其他包中使用。

  15. defer语句:  使用 defer 关键字可以推迟函数的执行,通常用于资源清理和错误处理。

    defer fmt.Println("This will be printed last.")
    fmt.Println("This will be printed first.")
    

defer 关键字用于延迟(推迟)函数的执行,它可以在函数返回之前执行一些操作。defer 通常用于资源管理、清理操作和错误处理等场景,以确保在函数返回前执行一些必要的操作,无论函数是否发生错误都会执行。

以下是一些 defer 的常见使用场景:

  1. 资源管理:  defer 经常用于打开资源(如文件、数据库连接、网络连接)后,确保在函数返回时关闭或释放资源,避免资源泄漏。

    func processFile(filename string) error {
        file, err := os.Open(filename)
        if err != nil {
            return err
        }
        defer file.Close() // 确保在函数返回前关闭文件
    
        // 文件处理操作
    }
    
  2. 计时:  defer 用于测量函数执行的时间。

    func measureTime() {
        start := time.Now()
        defer func() {
            elapsed := time.Since(start)
            fmt.Println("Function took:", elapsed)
        }()
    
        // 执行耗时操作
    }
    
  3. 日志记录:  在函数执行的开始和结束位置记录日志信息。

    func logStartAndEnd() {
        fmt.Println("Function started.")
        defer fmt.Println("Function ended.")
    
        // 函数操作
    }
    
  4. 锁释放:  在并发编程中,可以使用 defer 来释放锁,以确保在函数返回时解锁,防止死锁。

    func exampleMutex() {
        mutex.Lock()
        defer mutex.Unlock()
    
        // 执行操作
    }
    
  5. 错误处理:  在错误处理中使用 defer 可以确保在函数返回之前执行一些清理操作。

    func handleError() error {
        f, err := os.Open("file.txt")
        if err != nil {
            return err
        }
        defer f.Close() // 确保在返回前关闭文件
    
        // 文件操作
    }
    
  6. 数据库事务:  在数据库事务中,defer 用于提交或回滚事务。

    func processTransaction() error {
        tx := db.Begin()
        defer func() {
            if r := recover(); r != nil {
                tx.Rollback()
            }
        }()
    
        // 执行数据库操作
        // ...
    
        tx.Commit()
        return nil
    }
    

defer 关键字在Go中用于在函数返回前执行必要的操作,可以方便地控制函数的生命周期