TeamClass_MD/Go入门速成/Day1/Class2 Go的基本语法.md
2025-03-19 15:59:50 +08:00

266 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### **1. 基础结构**
```go
package main // 包声明(必须)
import "fmt" // 导入包
func main() { // 主函数(程序入口)
fmt.Println("Hello, World!")
}
```
---
### **2. 变量与常量**
- **变量声明**
```go
var a int = 10 // 显式类型
var b = 20 // 类型推断
c := 30 // 短声明(函数内使用)
var d, e int = 1, 2 // 多变量声明
```
- **常量**
```go
const Pi = 3.14
const (
A = 1
B = 2
)
```
- 着重强调:**开头是大写的是Public**
---
### **3. 基本数据类型**
- **基本类型**
```go
int, int8, int16, int32, int64
uint, uint8, uint16, uint32, uint64
float32, float64
bool
string
byte (等同于 uint8)
rune (等同于 int32, 表示 Unicode 字符)
```
- **复合类型**
```go
var arr [3]int // 数组(固定长度)
slice := []int{1, 2, 3} // 切片(动态数组)
m := map[string]int{"key": 1} // 映射(字典)
type Person struct { Name string } // 结构体
```
---
### **4. 控制结构**
- **条件语句**
```go
if x > 0 {
// ...
} else if x == 0 {
// ...
} else {
// ...
}
```
- **循环**
```go
for i := 0; i < 10; i++ { ... } // 传统 for 循环
for i < 10 { ... } // 类似 while
for index, value := range slice { ... } // 遍历切片/数组/map
```
- **Switch**
```go
switch x {
case 1:
// ...
case 2, 3: // 多值匹配
// ...
default:
// ...
}
```
- 特点:不需要break
---
### **5. 函数**
- **基本函数**
```go
func add(a int, b int) int {
return a + b
}
```
- **多返回值**
```go
func swap(a, b int) (int, int) {
return b, a
}
```
- **命名返回值**
```go
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return // 隐式返回 x, y
}
```
- **匿名函数与闭包**(即函数内套函数)
```go
func() {
fmt.Println("Anonymous function")
}()
```
---
### **6. 指针与结构体**
- **指针**
```go
var p *int
x := 10
p = &x
*p = 20 // 修改 x 的值
```
- 特点:
- Go 的指针**不支持算术运算**,避免了内存越界和非法访问的风险,同时通过垃圾回收机制自动管理内存,**减少了内存泄漏的可能性**。
- Go 的指针类型严格区分,空指针用 `nil` 表示,解引用空指针会触发 panic不支持**指针算术运算和强制类型转换**。
- **结构体与方法**
```go
type Circle struct {
Radius float64
}
// 方法(值接收者)
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
// 方法(指针接收者)
func (c *Circle) Scale(factor float64) {
c.Radius *= factor
}
```
---
### **7. 接口与错误处理**
- **接口**
```go
type Shape interface {
Area() float64
}
// 隐式实现接口
func (c Circle) Area() float64 { ... }
```
- **错误处理**
```go
func readFile() ([]byte, error) {
data, err := os.ReadFile("file.txt")
if err != nil {
return nil, err
}
return data, nil
}
// 调用
data, err := readFile()
if err != nil {
log.Fatal(err)
}
```
- **Panic & Recover**
```go
func safeCall() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered:", r)
}
}()
panic("Something went wrong!")
}
```
---
### **8. 并发编程**
- **Goroutine**
```go
go func() {
fmt.Println("Running in goroutine")
}()
```
- **Channel**(数据通道)
```go
ch := make(chan int)
go func() { ch <- 1 }() // 发送数据
value := <-ch // 接收数据
```
- **Select**(主要用于事件驱动)
```go
select {
case msg1 := <-ch1:
fmt.Println(msg1)
case msg2 := <-ch2:
fmt.Println(msg2)
case <-time.After(1 * time.Second):
fmt.Println("Timeout")
}
```
---
### **9. 包与模块**
- **创建模块**
```bash
go mod init xx
```
- **导入包**
```go
import (
"fmt"
"math/rand"
"github.com/user/package"
)
```
---
### **10. 其他特性**
- **Defer**
- `defer` 是 Go 语言中的一个关键字,用于延迟执行一个函数调用。**被 `defer` 修饰的函数调用会推迟到当前函数返回之前执行**,无论当前函数是正常返回还是由于错误(如 `panic`)提前返回。`defer` 的主要用途是确保某些操作(如资源释放、清理工作等)一定会被执行,避免遗漏。
```go
func readFile() {
file, _ := os.Open("file.txt")
defer file.Close() // 函数返回前执行
// ...
}
```
- **JSON 处理**
```go
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
data, _ := json.Marshal(user) //序列化
```
---
### **常用内置函数**
- `len()`:获取长度
- `cap()`:切片容量
- `make()`:创建切片/map/channel
- `append()`:切片追加元素