2025-03-19 15:56:43 +08:00
|
|
|
|
### **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()`:切片追加元素
|