Golang语言入门篇006_关键字与保留字详解
Go语言作为一种静态类型编程语言,具有一套预定义的关键字和保留字。这些关键字构成了Go语言语法的基础,每个关键字都有其特定的用途和语义。理解这些关键字对于掌握Go语言至关重要。本文将详细介绍Go语言的所有关键字和保留字,包括它们的用途、语法和使用示例。
1. Go语言关键字概述
Go语言的关键字是语言预定义的标识符,具有特殊的含义和用途。这些关键字不能用作变量名、函数名或其他自定义标识符。Go语言的关键字相对较少,这体现了Go语言设计简洁的理念。
Go语言目前共有25个关键字:
// Go语言关键字列表
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
2. Go语言关键字详解
2.1. break关键字
break
关键字用于跳出循环或switch语句。
// 在for循环中使用break
for i := 0; i < 10; i++ {if i == 5 {break // 跳出循环}fmt.Println(i)
}
// 在switch中使用break
switch value := 3; value {
case 1:fmt.Println("One")
case 3:fmt.Println("Three")break // 虽然可以使用,但switch默认会跳出fmt.Println("This won't be printed")
default:fmt.Println("Other")
}
2.2. case关键字
case
关键字用于switch或select语句中的分支条件。
// switch中的case
switch value := 5; value {
case 1:fmt.Println("One")
case 2, 3, 4:fmt.Println("Two, Three or Four")
case 5:fmt.Println("Five")
default:fmt.Println("Other")
}
// select中的case
ch1 := make(chan string)
ch2 := make(chan string)select {
case msg1 := <-ch1:fmt.Println("Received from ch1:", msg1)
case msg2 := <-ch2:fmt.Println("Received from ch2:", msg2)
default:fmt.Println("No message received")
}
2.3. chan关键字
chan
关键字用于声明通道类型,是Go语言并发编程的核心。
// 声明通道
var ch chan int
ch = make(chan int)// 带缓冲的通道
bufferedCh := make(chan string, 10)// 只发送通道
var sendCh chan<- int// 只接收通道
var receiveCh <-chan int// 通道操作
ch <- 42 // 发送
value := <-ch // 接收
2.4. const关键字
const
关键字用于声明常量。常量在编译时确定值,程序运行期间不能修改。
// 基本常量声明
const pi = 3.14159
const appName = "MyApp"// 显式类型声明
const version string = "1.0.0"
const maxBufferSize int = 1024// 批量声明
const (StatusOK = 200StatusNotFound = 404StatusServerError = 500
)// iota枚举
const (Monday = iotaTuesdayWednesdayThursdayFridaySaturdaySunday
)
2.5. continue关键字
continue
关键字用于跳过当前循环迭代。
// 在for循环中使用continue
for i := 0; i < 10; i++ {if i%2 == 0 {continue // 跳过偶数}fmt.Println(i) // 只打印奇数
}// 在嵌套循环中使用continue
outer:
for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {if i == 1 && j == 1 {continue outer // 跳到外层循环}fmt.Printf("i=%d, j=%d\n", i, j)}
}
2.6. default关键字
default
关键字用于switch和select语句中的默认分支。
// switch中的default
switch day := "Sunday"; day {
case "Monday":fmt.Println("工作日开始")
case "Friday":fmt.Println("工作日结束")
default:fmt.Println("其他日子")
}// select中的default
ch := make(chan string)
select {
case msg := <-ch:fmt.Println("Received:", msg)
default:fmt.Println("No message available")
}
2.7. defer关键字
defer
关键字用于延迟执行函数调用,常用于资源清理。
// 基本defer用法
func readFile(filename string) {file, err := os.Open(filename)if err != nil {log.Fatal(err)}defer file.Close() // 函数结束时自动关闭文件// 文件处理逻辑// ...
}// 多个defer按LIFO顺序执行
func example() {defer fmt.Println("First defer")defer fmt.Println("Second defer")defer fmt.Println("Third defer")fmt.Println("Function body")
}
// 输出顺序:
// Function body
// Third defer
// Second defer
// First defer// defer与参数求值
func deferWithParams() {i := 0defer fmt.Println("Deferred:", i) // 此时i的值是0i++fmt.Println("Final:", i) // 输出1
}
// 输出:
// Final: 1
// Deferred: 0
2.8. else关键字
else
关键字用于if语句中的替代条件。
// 基本else用法
if condition {// 条件为真时执行
} else {// 条件为假时执行
}// else if链
if score >= 90 {fmt.Println("优秀")
} else if score >= 80 {fmt.Println("良好")
} else if score >= 60 {fmt.Println("及格")
} else {fmt.Println("不及格")
}
2.9. fallthrough关键字
fallthrough
关键字用于switch语句中,使执行流继续到下一个case。
// fallthrough示例
switch score := 85; {
case score >= 90:fmt.Println("优秀")fallthrough
case score >= 80:fmt.Println("良好")fallthrough
case score >= 60:fmt.Println("及格")fallthrough
default:fmt.Println("继续努力")
}// 输出:
// 良好
// 及格
// 继续努力
2.10. for关键字
for
关键字用于循环结构,是Go语言中唯一的循环关键字。
// 传统for循环
for i := 0; i < 10; i++ {fmt.Println(i)
}// while循环形式
i := 0
for i < 10 {fmt.Println(i)i++
}// 无限循环
for {// 永远执行break // 需要跳出条件
}// range循环
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {fmt.Printf("Index: %d, Value: %d\n", index, value)
}// 只遍历键或值
for index := range numbers {fmt.Println(index)
}for _, value := range numbers {fmt.Println(value)
}
2.11. func关键字
func
关键字用于声明函数和方法。
// 普通函数声明
func add(a, b int) int {return a + b
}// 无返回值函数
func printMessage(msg string) {fmt.Println(msg)
}// 多返回值函数
func divide(a, b float64) (float64, error) {if b == 0 {return 0, errors.New("division by zero")}return a / b, nil
}// 可变参数函数
func sum(nums ...int) int {total := 0for _, num := range nums {total += num}return total
}// 方法声明
type Person struct {Name stringAge int
}func (p Person) SayHello() {fmt.Printf("Hello, I'm %s\n", p.Name)
}// 函数类型
type Calculator func(int, int) int// 匿名函数
func main() {multiply := func(a, b int) int {return a * b}result := multiply(3, 4)fmt.Println(result) // 输出: 12
}
2.12. go关键字
go
关键字用于启动goroutine,实现并发执行。
// 启动goroutine
go func() {fmt.Println("Hello from goroutine")
}()// 启动带参数的goroutine
go func(name string) {fmt.Printf("Hello, %s\n", name)
}("Alice")// 启动函数作为goroutine
func backgroundTask() {fmt.Println("Background task running")
}go backgroundTask()// 等待goroutine完成(需要sync.WaitGroup)
var wg sync.WaitGroup
wg.Add(1)
go func() {defer wg.Done()fmt.Println("Task completed")
}()
wg.Wait()
2.13. goto关键字
goto
关键字用于无条件跳转到标签。
// 基本goto用法
i := 0
LOOP:
if i < 3 {fmt.Println(i)i++goto LOOP
}// 在循环中使用goto
for i := 0; i < 10; i++ {if i == 5 {goto END}fmt.Println(i)
}
END:
fmt.Println("Loop ended")
2.14. if关键字
if
关键字用于条件判断。
// 基本if语句
if age >= 18 {fmt.Println("成年人")
} else {fmt.Println("未成年人")
}// 带初始化语句的if
if err := someFunction(); err != nil {fmt.Printf("Error: %v\n", err)
}// if-else if-else链
score := 85
if score >= 90 {fmt.Println("优秀")
} else if score >= 80 {fmt.Println("良好")
} else if score >= 60 {fmt.Println("及格")
} else {fmt.Println("不及格")
}
2.15. import关键字
import
关键字用于导入其他包。
// 单个包导入
import "fmt"
import "math"// 批量导入
import ("fmt""math""net/http""os"
)// 别名导入
import fm "fmt"
import m "math"// 点导入(不推荐)
import . "fmt"// 下划线导入(只导入包的副作用)
import _ "image/png"
2.16. interface关键字
interface
关键字用于声明接口类型。
// 基本接口
type Writer interface {Write([]byte) (int, error)
}// 空接口
type Any interface{}// 嵌套接口
type ReadWriter interface {ReaderWriter
}// 带方法的接口
type Stringer interface {String() string
}// 接口组合
type Reader interface {Read([]byte) (int, error)
}type Closer interface {Close() error
}type ReadCloser interface {ReaderCloser
}
2.17. map关键字
map
关键字用于声明映射类型。
// 声明映射
var userAges map[string]int// 初始化映射
userAges = make(map[string]int)// 字面量初始化
scores := map[string]int{"Alice": 95,"Bob": 87,"Carol": 92,
}// 带容量的映射
ages := make(map[string]int, 100)// 映射操作
ages["Alice"] = 25 // 赋值
age := ages["Alice"] // 取值
delete(ages, "Alice") // 删除键值对// 检查键是否存在
if age, exists := ages["Alice"]; exists {fmt.Printf("Alice's age is %d\n", age)
} else {fmt.Println("Alice not found")
}
2.18. package关键字
package
关键字用于声明当前文件所属的包。
// 声明main包
package main// 声明自定义包
package utils// 声明http包
package http
2.19. range关键字
range
关键字用于遍历数组、切片、映射、通道等。
// 遍历数组和切片
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {fmt.Printf("Index: %d, Value: %d\n", index, value)
}// 遍历映射
ages := map[string]int{"Alice": 25,"Bob": 30,"Carol": 28,
}
for name, age := range ages {fmt.Printf("%s is %d years old\n", name, age)
}// 遍历字符串
text := "Hello"
for index, char := range text {fmt.Printf("Index: %d, Char: %c\n", index, char)
}// 遍历通道
ch := make(chan int, 3)
go func() {ch <- 1ch <- 2ch <- 3close(ch)
}()for value := range ch {fmt.Println("Received:", value)
}
2.20. return关键字
return
关键字用于从函数返回。
// 无返回值函数中的return
func printMessage(msg string) {if msg == "" {return // 提前返回}fmt.Println(msg)
}// 有返回值函数中的return
func add(a, b int) int {return a + b
}// 多返回值函数中的return
func divide(a, b float64) (float64, error) {if b == 0 {return 0, errors.New("division by zero")}return a / b, nil
}// 命名返回值
func calculate(a, b int) (sum, product int) {sum = a + bproduct = a * breturn // 隐式返回命名返回值
}
2.21. select关键字
select
关键字用于通道操作的选择。
// 基本select语句
ch1 := make(chan string)
ch2 := make(chan string)select {
case msg1 := <-ch1:fmt.Println("Received from ch1:", msg1)
case msg2 := <-ch2:fmt.Println("Received from ch2:", msg2)
}// 带默认分支的select
select {
case msg := <-ch1:fmt.Println("Received:", msg)
default:fmt.Println("No message received")
}// 发送操作的select
select {
case ch1 <- "Hello":fmt.Println("Message sent")
default:fmt.Println("Channel is full")
}// 超时处理
timeout := time.After(2 * time.Second)
select {
case msg := <-ch1:fmt.Println("Received:", msg)
case <-timeout:fmt.Println("Timeout")
}
2.22. struct关键字
struct
关键字用于声明结构体类型。
// 基本结构体
type Person struct {Name stringAge int
}// 嵌套结构体
type Address struct {Street stringCity stringZip string
}type Employee struct {PersonAddressSalary float64
}// 带标签的结构体
type User struct {ID int `json:"id"`Username string `json:"username"`Password string `json:"-"` // 不序列化Email string `json:"email,omitempty"`
}// 匿名结构体
employee := struct {Name stringAge int
}{Name: "Alice",Age: 30,
}
2.23. switch关键字
switch
关键字用于多条件分支。
// 基本switch语句
day := "Monday"
switch day {
case "Monday":fmt.Println("Start of work week")
case "Friday":fmt.Println("End of work week")
default:fmt.Println("Mid-week day")
}// 不带条件的switch(相当于if-else链)
score := 85
switch {
case score >= 90:fmt.Println("优秀")
case score >= 80:fmt.Println("良好")
case score >= 60:fmt.Println("及格")
default:fmt.Println("不及格")
}// 多值case
switch day {
case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday":fmt.Println("工作日")
case "Saturday", "Sunday":fmt.Println("周末")
}// 类型switch
func processValue(v interface{}) {switch val := v.(type) {case int:fmt.Printf("Integer: %d\n", val)case string:fmt.Printf("String: %s\n", val)case bool:fmt.Printf("Boolean: %t\n", val)default:fmt.Printf("Unknown type: %T\n", val)}
}
2.24. type关键字
type
关键字用于定义新的类型。
// 类型别名
type Celsius float64
type Fahrenheit float64// 结构体类型
type Person struct {Name stringAge int
}// 接口类型
type Writer interface {Write([]byte) (int, error)
}// 函数类型
type Operation func(int, int) int// 类型定义与类型别名的区别(Go 1.9+)
type MyInt int // 新类型定义
type MyIntAlias = int // 类型别名
2.25. var关键字
var
关键字用于声明变量。
// 基本变量声明
var name string
var age int
var isStudent bool// 带初始值的声明
var version = "1.0.0"
var count int = 10// 批量声明
var (username stringpassword stringloginAttempts int
)// 指针变量
var ptr *int// 数组和切片
var numbers [10]int
var scores []int// 映射
var userRoles map[string]string// 通道
var ch chan string
3. 关键字使用注意事项
3.1. 不能用作标识符
所有关键字都不能用作变量名、函数名、类型名等自定义标识符:
// 错误示例 - 这些会导致编译错误
var if = 10 // 错误:if是关键字
func return() {} // 错误:return是关键字
type for int // 错误:for是关键字
3.2. 大小写敏感
Go语言是大小写敏感的,关键字必须使用小写:
// 正确
if true {fmt.Println("正确")
}// 错误 - 这些是合法的标识符,但不是关键字
If := "这不是if关键字"
For := "这不是for关键字"
3.3. 上下文相关性
某些关键字的含义依赖于上下文:
// chan在不同上下文中的用法
var ch chan int // 类型声明
ch <- 42 // 通道操作
value := <-ch // 通道操作// range在不同上下文中的用法
for i := range slice {} // 遍历索引
for i, v := range slice {} // 遍历索引和值
4. 保留字概述
除关键字外,Go还有一些预声明的标识符,虽然不是关键字,但建议避免用作自定义标识符:
// 预声明标识符(建议避免使用)// 类型bool byte complex64 complex128 error float32 float64int int8 int16 int32 int64 rune stringuint uint8 uint16 uint32 uint64 uintptr// 常量true false iota// 零值nil// 函数append cap close complex copy delete imag lenmake new panic print println real recover