go学习
main 文件结构与程序入口
1 | // 1. 声明包名。对于可执行文件,必须是 `main` |
package main: 定义了包名。main 是一个特殊的包,它告诉 Go 编译器这是一个可执行程序。
import "fmt": 导入标准库的 fmt 包,它提供了格式化输入输出的功能。导入的包必须被使用,否则编译会报错。
func main() { ... }: 定义了一个名为 main 的函数。当程序运行时,会自动从这个函数开始执行。
变量的声明和赋值
方式一:标准声明(var)
1 | // 声明一个 string 类型的变量 name,默认初始化为空字符串 "" |
方式二:短变量声明(使用:=)
在函数内部,用更加简洁的:=
来声明并初始化变量,其类型是由编译器自动推断的。1
2
3
4
5
6
7
8
9
10
11func main() {
// 短变量声明
name := "Bob" // string
age := 30 // int
weight := 65.5 // float64
// 同时声明多个
x, y, z := 1, "two", true
fmt.Println(name, age, weight, x, y, z)
}:=
不能在函数外(全局变量)使用。
常量声明(使用const)
常量的值在编译时确定,且运行期间不能修改。1
2
3
4
5
6const Pi = 3.14159
const Greeting = "Hello"
const (
StatusOK = 200
StatusNotFound = 404
)
分支结构(if/switch)
if
go的if语句不需要小括号(),但必须有花括号{}。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18score := 85
// 基本 if-else
if score >= 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}
// if 语句可以包含一个初始化语句(通常用于定义条件中使用的变量)
if grade := calculateGrade(score); grade == "A" { // grade 的作用域仅限于这个 if-else 块
fmt.Println("优秀!")
} else if grade == "B" {
fmt.Println("良好")
} else {
fmt.Println("继续努力")
}
// fmt.Println(grade) // 在这里写就会报错,因为grade未定义
switch语句
go的switch默认在执行完每个case后自动break,不需要显式写出,如果需要像c一样自动继续执行,要用fallthrough
关键字1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24fruit := "apple"
// 最基本的用法,匹配值
switch fruit {
case "apple":
fmt.Println("这是苹果")
case "banana", "orange": // 一个 case 可以匹配多个值
fmt.Println("这是香蕉或橙子")
default:
fmt.Println("未知水果")
}
// 可以没有表达式,在 case 中写条件判断(相当于替代复杂的 if-else-if 链)
score := 92
switch {
case score >= 90:
fmt.Println("等级 A")
case score >= 80:
fmt.Println("等级 B")
case score >= 70:
fmt.Println("等级 C")
default:
fmt.Println("等级 D")
}
循环结构
Go 语言中只有一种循环结构:for 循环。但它涵盖了其他语言中 for, while, do-while 的所有功能。
for用法
1 | for i := 0; i < 5; i++ { |
模拟while用法
1 | count := 0 |
无限循环
1 | // 无限循环,通常在内部配合 break 使用 |
遍历集合(for-range)
for-range 结构是遍历数组、切片、字符串、map 和通道(channel)的利器。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21// 1. 遍历数组/切片
numbers := []int{1, 2, 3, 4}
for index, value := range numbers {
fmt.Printf("索引: %d, 值: %d\n", index, value)
}
// 如果不需要索引,可以用下划线 _ 忽略
for _, value := range numbers {
fmt.Println(value)
}
// 2. 遍历字符串(得到的是字符的字节索引和 Unicode 码点(rune))
str := "Go语言"
for i, r := range str {
fmt.Printf("%d -> %c\n", i, r)
}
// 3. 遍历 map
person := map[string]string{"name": "Tom", "job": "Engineer"}
for key, value := range person {
fmt.Printf("%s: %s\n", key, value)
}