Go07-结构体与接口

发布时间:2026/7/16 23:01:07
Go07-结构体与接口 第6章结构体与接口6.1 结构体结构体是将多个字段组合在一起的复合类型。定义与使用// 定义结构体typePersonstruct{NamestringAgeintEmailstringAddress Address}typeAddressstruct{CitystringStreetstringZipCodestring}// 创建实例p1:Person{Name:张三,Age:25,Email:zhangsanexample.com,}// 访问字段fmt.Println(p1.Name)// 张三// 修改字段p1.Age26结构体标签typeUserstruct{IDintjson:id db:user_idNamestringjson:name db:usernameEmailstringjson:email db:emailPasswordstringjson:- 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())// 2006.2 接口接口定义了方法的集合是实现多态的基础。定义接口// 定义接口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.Widthr.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)}}6.3 组合与嵌入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)// 金毛6.4 设计模式策略模式// 排序策略接口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.strategystrategy}func(s*Sorter)Sort(arr[]int)[]int{returns.strategy.Sort(arr)}观察者模式// 观察者接口typeObserverinterface{Update(eventstring)}// 被观察者typeEventEmitterstruct{observers[]Observer}func(e*EventEmitter)Subscribe(observer Observer){e.observersappend(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)}6.5 练习实现一个简单的银行账户系统存款、取款、查询余额定义 Shape 接口实现三角形、圆形、矩形使用组合实现一个简单的消息队列实现一个简单的依赖注入容器6.6 下一章下一章我们将学习 Go 语言的错误处理。