Go语言的基本语法和c/c++ java等编程语言相类似,底层逻辑是互通的
-
包声明: 每个Go程序都由一个或多个包组成,包声明在文件的开头。
package关键字用于声明包名。package main -
导入语句: 使用
import关键字导入其他包,以便在程序中使用其功能。import "fmt" -
函数声明: 使用
func关键字声明函数。main函数是程序的入口点。func main() { // 代码... } -
变量声明: 使用
var关键字声明变量,指定变量名和类型。var age int -
短变量声明: 使用
:=运算符可以在声明变量的同时进行赋值。name := "Alice" -
数据类型: Go具有基本的数据类型,如整数、浮点数、字符串、布尔等。
var num int = 42 var price float64 = 9.99 var message string = "Hello, World!" var isTrue bool = true -
常量: 使用
const关键字声明常量。const pi = 3.14159 -
流程控制: Go使用
if、else、switch和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) } -
数组和切片: 使用数组和切片来存储一系列相同类型的数据。
var numbers [5]int numbers[0] = 1 numbers[1] = 2 var fruits = []string{"apple", "banana", "orange"} -
结构体: 使用
struct关键字定义自定义的数据结构。type Person struct { FirstName string LastName string Age int } -
指针: 使用指针来存储变量的内存地址,使用方式和c/c++相类似。
var x int = 10 var ptr *int = &x -
函数: 可以声明和调用函数,函数可以有参数和返回值。
func add(a, b int) int { return a + b } -
方法: Go支持在自定义类型上定义方法。
type Rectangle struct { width int height int } func (r Rectangle) area() int { return r.width * r.height } -
包和可见性: Go中的标识符的可见性是通过首字母大小写来确定的。大写字母开头的标识符是可导出的,可以在其他包中使用。
-
defer语句: 使用
defer关键字可以推迟函数的执行,通常用于资源清理和错误处理。defer fmt.Println("This will be printed last.") fmt.Println("This will be printed first.")
defer 关键字用于延迟(推迟)函数的执行,它可以在函数返回之前执行一些操作。defer 通常用于资源管理、清理操作和错误处理等场景,以确保在函数返回前执行一些必要的操作,无论函数是否发生错误都会执行。
以下是一些 defer 的常见使用场景:
-
资源管理:
defer经常用于打开资源(如文件、数据库连接、网络连接)后,确保在函数返回时关闭或释放资源,避免资源泄漏。func processFile(filename string) error { file, err := os.Open(filename) if err != nil { return err } defer file.Close() // 确保在函数返回前关闭文件 // 文件处理操作 } -
计时:
defer用于测量函数执行的时间。func measureTime() { start := time.Now() defer func() { elapsed := time.Since(start) fmt.Println("Function took:", elapsed) }() // 执行耗时操作 } -
日志记录: 在函数执行的开始和结束位置记录日志信息。
func logStartAndEnd() { fmt.Println("Function started.") defer fmt.Println("Function ended.") // 函数操作 } -
锁释放: 在并发编程中,可以使用
defer来释放锁,以确保在函数返回时解锁,防止死锁。func exampleMutex() { mutex.Lock() defer mutex.Unlock() // 执行操作 } -
错误处理: 在错误处理中使用
defer可以确保在函数返回之前执行一些清理操作。func handleError() error { f, err := os.Open("file.txt") if err != nil { return err } defer f.Close() // 确保在返回前关闭文件 // 文件操作 } -
数据库事务: 在数据库事务中,
defer用于提交或回滚事务。func processTransaction() error { tx := db.Begin() defer func() { if r := recover(); r != nil { tx.Rollback() } }() // 执行数据库操作 // ... tx.Commit() return nil }
defer 关键字在Go中用于在函数返回前执行必要的操作,可以方便地控制函数的生命周期