367 lines
8.0 KiB
Go
367 lines
8.0 KiB
Go
package main
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"sort"
|
||
"sync"
|
||
"time"
|
||
)
|
||
|
||
// 3.1 数组示例
|
||
func arrayExamples() {
|
||
fmt.Println("=== 数组示例 ===")
|
||
|
||
// 声明数组
|
||
var arr1 [5]int
|
||
arr2 := [3]string{"A", "B", "C"}
|
||
arr3 := [4]int{10, 20, 30, 40}
|
||
arr4 := [5]int{1, 2} // 部分初始化
|
||
arr5 := [...]int{1, 2, 3, 4, 5}
|
||
|
||
fmt.Printf("arr1: %v\n", arr1)
|
||
fmt.Printf("arr2: %v\n", arr2)
|
||
fmt.Printf("arr3: %v\n", arr3)
|
||
fmt.Printf("arr4: %v\n", arr4)
|
||
fmt.Printf("arr5: %v\n", arr5)
|
||
|
||
// 访问和修改
|
||
arr1[0] = 99
|
||
fmt.Printf("修改后 arr1: %v\n", arr1)
|
||
|
||
// 多维数组
|
||
matrix := [2][3]int{
|
||
{1, 2, 3},
|
||
{4, 5, 6},
|
||
}
|
||
fmt.Printf("matrix[0][1]: %d\n", matrix[0][1])
|
||
}
|
||
|
||
// 3.2 切片示例
|
||
func sliceExamples() {
|
||
fmt.Println("\n=== 切片示例 ===")
|
||
|
||
// 从数组创建
|
||
arr := [5]int{1, 2, 3, 4, 5}
|
||
s1 := arr[0:3]
|
||
s2 := arr[1:]
|
||
s3 := arr[:3]
|
||
s4 := arr[:]
|
||
|
||
fmt.Printf("s1: %v, len=%d, cap=%d\n", s1, len(s1), cap(s1))
|
||
fmt.Printf("s2: %v, len=%d, cap=%d\n", s2, len(s2), cap(s2))
|
||
fmt.Printf("s3: %v, len=%d, cap=%d\n", s3, len(s3), cap(s3))
|
||
fmt.Printf("s4: %v, len=%d, cap=%d\n", s4, len(s4), cap(s4))
|
||
|
||
// make 创建
|
||
s5 := make([]int, 5)
|
||
s6 := make([]int, 3, 10)
|
||
fmt.Printf("s5: %v, len=%d, cap=%d\n", s5, len(s5), cap(s5))
|
||
fmt.Printf("s6: %v, len=%d, cap=%d\n", s6, len(s6), cap(s6))
|
||
|
||
// append
|
||
s7 := []int{1, 2, 3}
|
||
s7 = append(s7, 4)
|
||
s7 = append(s7, 5, 6, 7)
|
||
s8 := []int{8, 9, 10}
|
||
s7 = append(s7, s8...)
|
||
fmt.Printf("s7 after append: %v\n", s7)
|
||
|
||
// 容量变化演示
|
||
fmt.Println("\n容量变化:")
|
||
s9 := make([]int, 0, 5)
|
||
for i := 1; i <= 10; i++ {
|
||
s9 = append(s9, i)
|
||
fmt.Printf("追加 %d: len=%d, cap=%d\n", i, len(s9), cap(s9))
|
||
}
|
||
|
||
// copy
|
||
src := []int{1, 2, 3, 4, 5}
|
||
dst := make([]int, 3)
|
||
n := copy(dst, src)
|
||
fmt.Printf("\n复制了 %d 个元素,dst: %v\n", n, dst)
|
||
|
||
// 共享底层数组陷阱
|
||
s10 := []int{1, 2, 3, 4, 5}
|
||
s11 := s10[1:3]
|
||
s11[0] = 99
|
||
fmt.Printf("\n共享数组陷阱:\n")
|
||
fmt.Printf("s10: %v\n", s10)
|
||
fmt.Printf("s11: %v\n", s11)
|
||
|
||
// 释放内存的正确方式
|
||
fmt.Println("\n释放内存:")
|
||
data := make([]int, 1000)
|
||
small := append([]int(nil), data[:10]...)
|
||
fmt.Printf("small cap: %d (原 data cap: %d)\n", cap(small), cap(data))
|
||
}
|
||
|
||
// 3.3 映射示例
|
||
func mapExamples() {
|
||
fmt.Println("\n=== 映射示例 ===")
|
||
|
||
// 创建映射
|
||
m1 := make(map[string]int)
|
||
m1["one"] = 1
|
||
m1["two"] = 2
|
||
|
||
m2 := map[string]int{
|
||
"one": 1,
|
||
"two": 2,
|
||
"three": 3,
|
||
}
|
||
|
||
fmt.Printf("m1: %v\n", m1)
|
||
fmt.Printf("m2: %v\n", m2)
|
||
|
||
// 读取和检查存在
|
||
value, exists := m2["two"]
|
||
fmt.Printf("two 存在: %v, 值: %d\n", exists, value)
|
||
|
||
value, exists = m2["four"]
|
||
fmt.Printf("four 存在: %v, 值: %d\n", exists, value)
|
||
|
||
// 删除
|
||
delete(m2, "one")
|
||
fmt.Printf("删除 one 后: %v\n", m2)
|
||
|
||
// 遍历(无序)
|
||
fmt.Println("\n遍历映射:")
|
||
for k, v := range m2 {
|
||
fmt.Printf("%s: %d\n", k, v)
|
||
}
|
||
|
||
// nil 映射
|
||
var m3 map[string]int
|
||
fmt.Printf("\nnil 映射读取: %d\n", m3["key"])
|
||
// m3["key"] = 1 // panic!
|
||
|
||
// 嵌套映射
|
||
scores := map[string]map[string]int{
|
||
"Alice": {"math": 95, "english": 88},
|
||
"Bob": {"math": 92, "english": 90},
|
||
}
|
||
fmt.Printf("\nAlice 数学成绩: %d\n", scores["Alice"]["math"])
|
||
|
||
// 动态创建
|
||
if scores["Charlie"] == nil {
|
||
scores["Charlie"] = make(map[string]int)
|
||
}
|
||
scores["Charlie"]["math"] = 85
|
||
fmt.Printf("Charlie 数学成绩: %d\n", scores["Charlie"]["math"])
|
||
}
|
||
|
||
// 3.4 结构体示例
|
||
func structExamples() {
|
||
fmt.Println("\n=== 结构体示例 ===")
|
||
|
||
// 定义结构体
|
||
type Person struct {
|
||
Name string
|
||
Age int
|
||
Email string
|
||
}
|
||
|
||
// 初始化
|
||
p1 := Person{Name: "Alice", Age: 25, Email: "alice@example.com"}
|
||
p2 := Person{"Bob", 30, "bob@example.com"}
|
||
p3 := Person{Name: "Charlie"}
|
||
p4 := &Person{Name: "David", Age: 28}
|
||
|
||
fmt.Printf("p1: %+v\n", p1)
|
||
fmt.Printf("p2: %+v\n", p2)
|
||
fmt.Printf("p3: %+v\n", p3)
|
||
fmt.Printf("p4: %+v\n", *p4)
|
||
|
||
// 方法
|
||
type Rectangle struct {
|
||
Width float64
|
||
Height float64
|
||
}
|
||
|
||
rect := Rectangle{Width: 10, Height: 5}
|
||
|
||
// 定义方法(在函数外定义)
|
||
area := rect.Width * rect.Height
|
||
fmt.Printf("矩形面积: %.2f\n", area)
|
||
|
||
// 嵌入
|
||
type Employee struct {
|
||
Person
|
||
ID int
|
||
Salary float64
|
||
}
|
||
|
||
e := Employee{
|
||
Person: Person{Name: "Eve", Age: 35},
|
||
ID: 1001,
|
||
Salary: 50000,
|
||
}
|
||
|
||
fmt.Printf("员工姓名: %s\n", e.Name) // 直接访问嵌入字段
|
||
fmt.Printf("员工 ID: %d\n", e.ID)
|
||
|
||
// 结构体标签
|
||
type User struct {
|
||
ID int `json:"id"`
|
||
Name string `json:"name"`
|
||
Email string `json:"email,omitempty"`
|
||
Password string `json:"-"`
|
||
}
|
||
|
||
user := User{ID: 1, Name: "Alice", Email: "alice@example.com", Password: "secret"}
|
||
jsonData, _ := json.Marshal(user)
|
||
fmt.Printf("JSON: %s\n", jsonData)
|
||
}
|
||
|
||
// 3.5 学生管理系统
|
||
type Student struct {
|
||
ID int `json:"id"`
|
||
Name string `json:"name"`
|
||
Age int `json:"age"`
|
||
Score float64 `json:"score"`
|
||
}
|
||
|
||
type StudentManager struct {
|
||
students map[int]*Student
|
||
nextID int
|
||
}
|
||
|
||
func NewStudentManager() *StudentManager {
|
||
return &StudentManager{
|
||
students: make(map[int]*Student),
|
||
nextID: 1,
|
||
}
|
||
}
|
||
|
||
func (sm *StudentManager) AddStudent(name string, age int, score float64) int {
|
||
id := sm.nextID
|
||
sm.nextID++
|
||
sm.students[id] = &Student{ID: id, Name: name, Age: age, Score: score}
|
||
return id
|
||
}
|
||
|
||
func (sm *StudentManager) GetStudent(id int) *Student {
|
||
return sm.students[id]
|
||
}
|
||
|
||
func (sm *StudentManager) UpdateStudent(id int, name string, age int, score float64) bool {
|
||
if student, exists := sm.students[id]; exists {
|
||
student.Name = name
|
||
student.Age = age
|
||
student.Score = score
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
|
||
func (sm *StudentManager) DeleteStudent(id int) bool {
|
||
if _, exists := sm.students[id]; exists {
|
||
delete(sm.students, id)
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
|
||
func (sm *StudentManager) GetAllStudents() []*Student {
|
||
students := make([]*Student, 0, len(sm.students))
|
||
for _, s := range sm.students {
|
||
students = append(students, s)
|
||
}
|
||
return students
|
||
}
|
||
|
||
func (sm *StudentManager) SortByScore(descending bool) []*Student {
|
||
students := sm.GetAllStudents()
|
||
sort.Slice(students, func(i, j int) bool {
|
||
if descending {
|
||
return students[i].Score > students[j].Score
|
||
}
|
||
return students[i].Score < students[j].Score
|
||
})
|
||
return students
|
||
}
|
||
|
||
func studentManagerDemo() {
|
||
fmt.Println("\n=== 学生管理系统 ===")
|
||
|
||
manager := NewStudentManager()
|
||
|
||
id1 := manager.AddStudent("Alice", 20, 95.5)
|
||
id2 := manager.AddStudent("Bob", 22, 88.0)
|
||
id3 := manager.AddStudent("Charlie", 21, 92.5)
|
||
|
||
fmt.Printf("添加学生 ID: %d, %d, %d\n", id1, id2, id3)
|
||
|
||
manager.UpdateStudent(id1, "Alice", 21, 97.0)
|
||
fmt.Printf("更新后 Alice: %+v\n", manager.GetStudent(id1))
|
||
|
||
manager.DeleteStudent(id2)
|
||
fmt.Printf("删除后学生数量: %d\n", len(manager.GetAllStudents()))
|
||
|
||
sorted := manager.SortByScore(true)
|
||
fmt.Println("\n按分数降序排列:")
|
||
for _, s := range sorted {
|
||
fmt.Printf(" %s: %.1f\n", s.Name, s.Score)
|
||
}
|
||
|
||
jsonStr, _ := json.MarshalIndent(manager.students, "", " ")
|
||
fmt.Println("\nJSON 导出:")
|
||
fmt.Println(string(jsonStr))
|
||
}
|
||
|
||
// 3.6 性能对比
|
||
func slicePerformance() {
|
||
fmt.Println("\n=== 切片性能对比 ===")
|
||
|
||
// 预分配容量
|
||
start := time.Now()
|
||
s1 := make([]int, 0, 10000)
|
||
for i := 0; i < 10000; i++ {
|
||
s1 = append(s1, i)
|
||
}
|
||
fmt.Printf("预分配容量耗时: %v\n", time.Since(start))
|
||
|
||
// 不预分配容量
|
||
start = time.Now()
|
||
s2 := make([]int, 0)
|
||
for i := 0; i < 10000; i++ {
|
||
s2 = append(s2, i)
|
||
}
|
||
fmt.Printf("不预分配容量耗时: %v\n", time.Since(start))
|
||
}
|
||
|
||
// 3.7 并发安全映射
|
||
func concurrentMapDemo() {
|
||
fmt.Println("\n=== 并发安全映射 ===")
|
||
|
||
var m = make(map[string]int)
|
||
var mu sync.RWMutex
|
||
|
||
var wg sync.WaitGroup
|
||
|
||
// 写操作
|
||
for i := 0; i < 100; i++ {
|
||
wg.Add(1)
|
||
go func(id int) {
|
||
defer wg.Done()
|
||
mu.Lock()
|
||
m[fmt.Sprintf("key%d", id%10)] = id
|
||
mu.Unlock()
|
||
}(i)
|
||
}
|
||
|
||
wg.Wait()
|
||
fmt.Printf("最终映射大小: %d\n", len(m))
|
||
}
|
||
|
||
func main() {
|
||
arrayExamples()
|
||
sliceExamples()
|
||
mapExamples()
|
||
structExamples()
|
||
studentManagerDemo()
|
||
slicePerformance()
|
||
concurrentMapDemo()
|
||
}
|