JVM 垃圾回收机制完整详解
2026/7/17 0:24:11
结构体是将多个字段组合在一起的复合类型。
// 定义结构体typePersonstruct{NamestringAgeintEmailstringAddress Address}typeAddressstruct{CitystringStreetstringZipCodestring}// 创建实例p1:=Person{Name:"张三",Age:25,Email:"zhangsan@example.com",}// 访问字段fmt.Println(p1.Name)// 张三// 修改字段p1.Age=26typeUserstruct{IDint`json:"id" db:"user_id"`Namestring`json:"name" db:"username"`Emailstring`json:"email" db:"email"`Passwordstring`json:"-" db:"password"`}// 标签用于 JSON 序列化、数据库映射等// json:"-" 表示忽略该字段typePersonstruct{string// 匿名字段int// 匿名字段}p:=Person{"张三",25}fmt.Println(p.string)// 张三fmt.Println(p.int)// 25// 匿名字段可以嵌入其他结构体typeEmployeestruct{Person// 嵌入 PersonCompanystring}e:=Employee{Person:Person{"张三",25},Company:"Google",}fmt.Println(e.Name)// 可以直接访问 Person 的字段typeRectanglestruct{Width,Heightfloat64}// 值接收者func(r Rectangle)Area()float64{returnr.Width*r.Height}// 指针接收者func(r*Rectangle)Scale(factorfloat64){r.Width*=factor r.Height*=factor}// 使用rect:=Rectangle{10,5}fmt.Println("面积:",rect.Area())// 50rect.Scale(2)fmt.Println("缩放后面积:",rect.Area())// 200接口定义了方法的集合,是实现多态的基础。
// 定义接口typeShapeinterface{Area()float64Perimeter()float64}// 定义另一个接口typeStringerinterface{String()string}// Rectangle 实现 Shape 接口typeRectanglestruct{Width,Heightfloat64}func(r Rectangle)Area()float64{returnr.Width*r.Height}func(r Rectangle)Perimeter()float64{return2*(r.Width+r.Height)}// Circle 实现 Shape 接口typeCirclestruct{Radiusfloat64}func(c Circle)Area()float64{returnmath.Pi*c.Radius*c.Radius}func(c Circle)Perimeter()float64{return2*math.Pi*c.Radius}// 函数接受任何实现了 Shape 接口的类型funcprintShapeInfo(s Shape){fmt.Printf("面积: %.2f, 周长: %.2f\n",s.Area(),s.Perimeter())}// 使用rect:=Rectangle{10,5}circle:=Circle{5}printShapeInfo(rect)// 面积: 50.00, 周长: 30.00printShapeInfo(circle)// 面积: 78.54, 周长: 31.42// 空接口可以接受任何类型funcprintAnything(vinterface{}){fmt.Printf("类型: %T, 值: %v\n",v,v)}// 使用printAnything(42)// 类型: int, 值: 42printAnything("hello")// 类型: string, 值: helloprintAnything(3.14)// 类型: float64, 值: 3.14// 类型断言funcdescribe(iinterface{}){switchv:=i.(type){caseint:fmt.Printf("整数: %d\n",v)casestring:fmt.Printf("字符串: %s\n",v)default:fmt.Printf("未知类型: %T\n",v)}}Go 通过组合(而非继承)实现代码复用。
// 基础结构体typeAnimalstruct{Namestring}func(a Animal)Speak()string{return"..."}// 嵌入 AnimaltypeDogstruct{Animal// 嵌入Breedstring}func(d Dog)Speak()string{return"汪汪!"}// 使用d:=Dog{Animal:Animal{Name:"旺财"},Breed:"金毛",}fmt.Println(d.Name)// 旺财(从 Animal 继承)fmt.Println(d.Speak())// 汪汪!(方法覆盖)fmt.Println(d.Breed)// 金毛// 排序策略接口typeSortStrategyinterface{Sort([]int)[]int}// 冒泡排序typeBubbleSortstruct{}func(b BubbleSort)Sort(arr[]int)[]int{// 实现冒泡排序returnarr}// 快速排序typeQuickSortstruct{}func(q QuickSort)Sort(arr[]int)[]int{// 实现快速排序returnarr}// 上下文typeSorterstruct{strategy SortStrategy}func(s*Sorter)SetStrategy(strategy SortStrategy){s.strategy=strategy}func(s*Sorter)Sort(arr[]int)[]int{returns.strategy.Sort(arr)}// 观察者接口typeObserverinterface{Update(eventstring)}// 被观察者typeEventEmitterstruct{observers[]Observer}func(e*EventEmitter)Subscribe(observer Observer){e.observers=append(e.observers,observer)}func(e*EventEmitter)Emit(eventstring){for_,observer:=rangee.observers{observer.Update(event)}}// 具体观察者typeLoggerstruct{}func(l Logger)Update(eventstring){fmt.Printf("日志: %s\n",event)}typeAlertstruct{}func(a Alert)Update(eventstring){fmt.Printf("警报: %s\n",event)}下一章我们将学习 Go 语言的错误处理。