Go07-结构体与接口
2026/7/16 23:01:01 网站建设 项目流程

第6章:结构体与接口

6.1 结构体

结构体是将多个字段组合在一起的复合类型。

定义与使用

// 定义结构体typePersonstruct{NamestringAgeintEmailstringAddress Address}typeAddressstruct{CitystringStreetstringZipCodestring}// 创建实例p1:=Person{Name:"张三",Age:25,Email:"zhangsan@example.com",}// 访问字段fmt.Println(p1.Name)// 张三// 修改字段p1.Age=26

结构体标签

typeUserstruct{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

6.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.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)}}

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.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)}

6.5 练习

  1. 实现一个简单的银行账户系统(存款、取款、查询余额)
  2. 定义 Shape 接口,实现三角形、圆形、矩形
  3. 使用组合实现一个简单的消息队列
  4. 实现一个简单的依赖注入容器

6.6 下一章

下一章我们将学习 Go 语言的错误处理。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询