Go语言虽然不是纯粹的面向对象语言,但它通过结构体(struct)、接口(interface)和方法(method)提供了面向对象编程的能力。下面我将通过具体示例展示Go中如何实现类、封装、继承、多态以及构造函数等概念。

1. 类与封装

在Go中,使用结构体(struct)来定义"类",并通过大小写控制访问权限实现封装。 

package mainimport "fmt"// Person 类(结构体)
type Person struct {name string // 小写开头,私有字段(仅在当前包内可访问)Age  int    // 大写开头,公共字段(可在其他包中访问)
}// NewPerson 构造函数(工厂函数)
// 通常以New开头命名构造函数
func NewPerson(name string, age int) *Person {return &Person{name: name,Age:  age,}
}// GetName 获取name的方法(Getter)
// 由于name是私有的,需要通过方法访问
func (p *Person) GetName() string {return p.name
}// SetName 设置name的方法(Setter)
func (p *Person) SetName(name string) {p.name = name
}// Introduce 方法
func (p *Person) Introduce() {fmt.Printf("大家好,我是%s,今年%d岁。\n", p.name, p.Age)
}func main() {// 使用构造函数创建Person实例person := NewPerson("张三", 25)// 访问公共字段fmt.Println("年龄:", person.Age)// 通过方法访问私有字段fmt.Println("姓名:", person.GetName())// 修改私有字段person.SetName("李四")// 调用方法person.Introduce()
}

2. 继承(组合) 

 Go没有传统意义上的继承,而是通过结构体嵌入(embedding)实现组合。

package mainimport "fmt"// Animal 基类
type Animal struct {name string
}// NewAnimal 构造函数
func NewAnimal(name string) *Animal {return &Animal{name: name}
}// Speak 方法
func (a *Animal) Speak() {fmt.Println(a.name, "发出声音")
}// Eat 方法
func (a *Animal) Eat() {fmt.Println(a.name, "正在吃东西")
}// Dog 继承Animal
type Dog struct {*Animal          // 嵌入Animal,相当于继承Breed   string  // 狗的品种
}// NewDog 构造函数
func NewDog(name, breed string) *Dog {return &Dog{Animal: NewAnimal(name),Breed:  breed,}
}// Speak 方法重写
func (d *Dog) Speak() {fmt.Println(d.name, "汪汪叫")
}// Fetch 子类特有方法
func (d *Dog) Fetch() {fmt.Println(d.name, "正在捡球")
}func main() {animal := NewAnimal("普通动物")animal.Speak()animal.Eat()dog := NewDog("阿黄", "金毛")dog.Speak()    // 调用重写后的方法dog.Eat()      // 调用继承的方法dog.Fetch()    // 调用子类特有方法// 通过嵌入字段访问基类字段fmt.Println("狗的名字:", dog.name)fmt.Println("狗的品种:", dog.Breed)
}

 3. 多态(接口实现)

Go通过接口(interface)实现多态。

package mainimport "fmt"// Shape 接口
type Shape interface {Area() float64Perimeter() float64
}// Rectangle 矩形类
type Rectangle struct {width, height float64
}// NewRectangle 构造函数
func NewRectangle(width, height float64) *Rectangle {return &Rectangle{width, height}
}// Area 实现Shape接口的方法
func (r *Rectangle) Area() float64 {return r.width * r.height
}// Perimeter 实现Shape接口的方法
func (r *Rectangle) Perimeter() float64 {return 2 * (r.width + r.height)
}// Circle 圆形类
type Circle struct {radius float64
}// NewCircle 构造函数
func NewCircle(radius float64) *Circle {return &Circle{radius}
}// Area 实现Shape接口的方法
func (c *Circle) Area() float64 {return 3.14 * c.radius * c.radius
}// Perimeter 实现Shape接口的方法
func (c *Circle) Perimeter() float64 {return 2 * 3.14 * c.radius
}// PrintShapeInfo 多态函数,接受任何实现了Shape接口的类型
func PrintShapeInfo(s Shape) {fmt.Printf("面积: %.2f, 周长: %.2f\n", s.Area(), s.Perimeter())
}func main() {rect := NewRectangle(10, 5)circle := NewCircle(7)// 相同接口,不同表现PrintShapeInfo(rect)PrintShapeInfo(circle)// 接口类型断言if r, ok := rect.(*Rectangle); ok {fmt.Println("这是一个矩形,宽:", r.width, "高:", r.height)}// 类型开关(type switch)var s Shape = circleswitch v := s.(type) {case *Rectangle:fmt.Println("矩形:", v.width, v.height)case *Circle:fmt.Println("圆形,半径:", v.radius)default:fmt.Println("未知形状")}
}

 4. 方法实现细节

Go中的方法可以绑定到任何类型(不仅仅是结构体),包括基本类型。 

package mainimport ("fmt""math"
)// MyInt 自定义类型
type MyInt int// Double 方法
func (m MyInt) Double() MyInt {return m * 2
}// Point 结构体
type Point struct {X, Y float64
}// DistanceTo 方法(值接收者)
func (p Point) DistanceTo(q Point) float64 {return math.Hypot(q.X-p.X, q.Y-p.Y)
}// Scale 方法(指针接收者,会修改原值)
func (p *Point) Scale(factor float64) {p.X *= factorp.Y *= factor
}// String 方法(实现Stringer接口)
func (p Point) String() string {return fmt.Sprintf("Point{X: %.2f, Y: %.2f}", p.X, p.Y)
}func main() {// 自定义类型方法num := MyInt(5)fmt.Println(num.Double()) // 10// 结构体方法p1 := Point{1, 2}p2 := Point{4, 6}fmt.Println("距离:", p1.DistanceTo(p2)) // 5p1.Scale(2)fmt.Println(p1) // 使用String方法输出: Point{X: 2.00, Y: 4.00}// 指针与值的自动转换p3 := &Point{3, 4}fmt.Println("距离:", p3.DistanceTo(p2)) // Go会自动解引用p2.Scale(0.5) // Go会自动取地址fmt.Println(p2)
}

 5. 综合示例

package mainimport ("fmt""strings"
)// Employee 基类
type Employee struct {name     stringsalary   float64vacation bool
}// NewEmployee 构造函数
func NewEmployee(name string, salary float64) *Employee {return &Employee{name:     name,salary:   salary,vacation: false,}
}// GetName Getter
func (e *Employee) GetName() string {return e.name
}// GetSalary Getter
func (e *Employee) GetSalary() float64 {return e.salary
}// TakeVacation 方法
func (e *Employee) TakeVacation() {e.vacation = true
}// Work 方法
func (e *Employee) Work() {fmt.Printf("%s 正在工作...\n", e.name)
}// String 方法
func (e *Employee) String() string {return fmt.Sprintf("员工: %s, 薪资: %.2f, 休假中: %v", e.name, e.salary, e.vacation)
}// Developer 子类
type Developer struct {*Employee         // 嵌入Employeelanguage  string // 开发语言
}// NewDeveloper 构造函数
func NewDeveloper(name string, salary float64, language string) *Developer {return &Developer{Employee: NewEmployee(name, salary),language: language,}
}// Work 方法重写
func (d *Developer) Work() {fmt.Printf("%s 正在用 %s 写代码...\n", d.GetName(), d.language)
}// Debug 特有方法
func (d *Developer) Debug() {fmt.Printf("%s 正在调试 %s 代码...\n", d.GetName(), d.language)
}// Manager 子类
type Manager struct {*Employee        // 嵌入Employeeteam      []string // 团队成员
}// NewManager 构造函数
func NewManager(name string, salary float64, team []string) *Manager {return &Manager{Employee: NewEmployee(name, salary),team:     team,}
}// Work 方法重写
func (m *Manager) Work() {fmt.Printf("%s 正在管理团队: %s\n", m.GetName(), strings.Join(m.team, ", "))
}// ConductMeeting 特有方法
func (m *Manager) ConductMeeting() {fmt.Printf("%s 正在主持会议\n", m.GetName())
}// Worker 接口
type Worker interface {Work()GetName() stringGetSalary() float64
}// Company 公司类
type Company struct {workers []Worker
}// AddWorker 添加员工
func (c *Company) AddWorker(w Worker) {c.workers = append(c.workers, w)
}// StartWorkDay 开始工作日
func (c *Company) StartWorkDay() {fmt.Println("===== 工作日开始 =====")for _, worker := range c.workers {worker.Work()}fmt.Println("===== 工作日结束 =====")
}func main() {// 创建公司company := &Company{}// 创建员工dev1 := NewDeveloper("张三", 15000, "Go")dev2 := NewDeveloper("李四", 16000, "Python")manager := NewManager("王五", 25000, []string{"张三", "李四"})// 员工休假dev1.TakeVacation()// 添加员工到公司company.AddWorker(dev1)company.AddWorker(dev2)company.AddWorker(manager)// 开始工作company.StartWorkDay()// 调用特有方法dev2.Debug()manager.ConductMeeting()// 打印员工信息fmt.Println(dev1)fmt.Println(dev2)fmt.Println(manager)
}

关键概念总结

  1. 类与封装:Go使用结构体定义类,通过字段/方法名的大小写控制访问权限(大写公开,小写私有)

  2. 构造函数:Go没有真正的构造函数,通常使用NewXxx形式的工厂函数

  3. 继承:通过结构体嵌入实现组合式继承

  4. 多态:通过接口实现,任何实现了接口所有方法的类型都自动满足该接口

  5. 方法:可以绑定到任何类型,接收者可以是值或指针

  6. 接口:定义行为而非实现,是实现多态的关键

Go的面向对象方式与传统OOP语言有所不同,它更强调组合而非继承,通过接口实现多态,这种方式更灵活且避免了传统继承的许多问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86482.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86482.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86482.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么android要使用Binder机制

1.linux中大多数标准 IPC 场景(如管道、消息队列、ioctl 等)的进程间通信机制 ------------------ ------------------ ------------------ | 用户进程 A | | 内核空间 | | 用户进程 B | | (User Spa…

OpenCV CUDA模块设备层-----双曲余弦函数cosh()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数用于计算四维浮点向量(float4类型)的双曲余弦值,作用于CUDA设备端。双曲余弦函数定义为cosh(x) (eˣ …

48页PPT | 企业数字化转型关键方法论:实践路径、案例和落地评估框架

目录 一、什么是企业数据化转型? 二、为什么要进行数据化转型? 1. 市场复杂性与不确定性上升 2. 内部流程效率与协同难题突出 3. 数字资产沉淀不足,智能化基础薄弱 三、数据化流程管理:从“业务流程”到“数据流程”的对齐 …

VTK中的形态学处理

VTK图像处理代码解析:阈值化与形态学开闭运算 这段代码展示了使用VTK进行医学图像处理的两个关键步骤:阈值分割和形态学开闭运算。下面我将详细解析每个部分的功能和实现原理。 处理前 处理后 1. 阈值分割部分 (vtkImageThreshold) vtkSmartPointer<vtkImageThresho…

xlsx.utils.sheet_to_json() 方法详解

sheet_to_json() 是 SheetJS/xlsx 库中最常用的方法之一&#xff0c;用于将 Excel 工作表&#xff08;Worksheet&#xff09;转换为 JSON 格式数据。下面我将全面讲解它的用法、参数配置和实际应用场景。 基本语法 javascript 复制 下载 const jsonData XLSX.utils.sheet…

〔从零搭建〕BI可视化平台部署指南

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨杭州奥零数据科技官网&#xf…

合规型区块链RWA系统解决方案报告——机构资产数字化的终极武器

&#xff08;跨境金融科技解决方案白皮书&#xff09; 一、直击机构客户四大痛点 痛点传统方案缺陷我们的破局点✖️ 跨境资产流动性差结算周期30天&#xff0c;摩擦成本超8%▶️ 724h全球实时交易&#xff08;速度提升90%&#xff09;✖️ 合规成本飙升KYC/AML人工审核占成本…

探索阿里云容器:解锁云原生应用的无限可能

引言&#xff1a;容器时代的开启 在数字化浪潮汹涌澎湃的当下&#xff0c;云计算已成为企业创新与发展的关键驱动力。从早期的基础设施即服务&#xff08;IaaS&#xff09;&#xff0c;到如今蓬勃发展的平台即服务&#xff08;PaaS&#xff09;和软件即服务&#xff08;SaaS&a…

spring-ai 1.0.0 (1)模型调用能力

听说1.0是一个非常好用的版本&#xff0c;最后还是扛不住听说的压力&#xff0c;为了落实自己悬浮心理&#xff0c;自己还是着手实践一下了。 第一步pom集成&#xff1a; 参考spring-projects/spring-ai | DeepWiki维基以及官方文档入门 &#xff1a;&#xff1a; Spring AI …

数据分享:汽车行业-汽车属性数据集

说明&#xff1a;如需数据可以直接到文章最后关注获取。 1.数据背景 Automobile数据集源自于对汽车市场深入研究的需求&#xff0c;旨在为汽车行业提供一个全面且详细的资源&#xff0c;以便更好地理解影响汽车价格及性能的各种因素。该数据集最初由卡内基梅隆大学&#x…

C++ 第三阶段:语言改进 - 第四节:nullptr vs NULL

目录 一、背景与概述 二、NULL 的定义与问题 1. NULL 的定义 2. NULL 的问题 三、nullptr 的定义与优势 1. nullptr 的定义 2. nullptr 的优势 四、nullptr 与 NULL 的对比 五、实际应用场景 1. 初始化指针 2. 函数调用与重载 3. 条件判断 4. 模板与泛型编程 六、…

计算机存储器容量扩展设计实例解析

存储器容量扩充是《计算机组成原理》课程的重要知识点。讲解一个例题&#xff0c;以说明进行存储器容量扩充设计的方法。 题目&#xff1a;在32位计算机系统中&#xff0c;用8K16位的SRAM芯片组成一个64KB的存储器&#xff0c;已知起始地址为&#xff1a;6000 0000H。已知&…

转载-秒杀系统—1.架构设计和方案简介

转载&#xff1a; https://mp.weixin.qq.com/s?__bizMzg5MzY5NDM3MQ&mid2247490866&idx1&sn0081517454680c85e0ed23eda4e82df5&chksmc02ba5fef75c2ce8b0c7f54182f3bda539230c75d2d75ed2b514b93decc0ff0c5de548a35dc3&cur_album_id3548464749150224391&…

Kubernetes中的容器生命周期回调

在介绍Kubernetes容器生命周期回调前&#xff0c;展示一个案例。 有个私有化部署的项目需要跑一个redis用作缓存&#xff0c;因redis中的数据不需要持久化&#xff0c;选择在Kubernetes中通过deployment的方式部署&#xff0c;下面是deployment的代码片段&#xff0c; ......…

基于STM32的工业仓库环境智能监控系统设计

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】设计意义【5】市面上同类产品研究现状【6】摘要 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 模块的技术详情介绍【1】ESP8266-WIFI模块…

如何在 Manjaro Linux 上启用 AUR 仓库来安装软件包

Manjaro 是基于 Arch 的系统&#xff0c;是了解和学习 Arch Linux 命令的绝佳方式。它自带所有流行的桌面环境界面&#xff0c;无论是 XFCE 还是 Gnome 的爱好者&#xff0c;都可以在 Manjaro 中直接使用。 Manjaro 或 Arch Linux 的默认软件包管理器是 Pacman&#xff0c;我们…

有限上升时间信号的反射波形

有限上升时间信号的反射波形: 从上一节讨论中我们知道&#xff0c;阻抗不连续的点处&#xff0c;反射信号是入射信号的一个副本&#xff0c;并讨论了上升时间为0的信号的反射情况。这些规律对于上升时间不为0的信号同样适用&#xff0c;只不过入射信号和反射信号的叠加稍稍复杂…

Vue 3.4+ defineModel 全面详解 + 实战最佳实践

&#x1f31f; 前言&#xff1a;为什么要关注 defineModel&#xff1f; 过去我们在 Vue 组件中使用 v-model 时&#xff0c;常需要这样写&#xff1a; // 子组件 defineProps([modelValue]) defineEmits([update:modelValue])function update(val) {emit(update:modelValue, …

MySQL事物隔离级别详解

目录 事物隔离级别总结 实际情况演示 脏读&#xff08;未提交&#xff09; 避免脏读&#xff08;读已提交&#xff09; 不可重复读 可重复读 幻读 事物隔离级别总结 SQL标准定义了四种事物隔离级别&#xff0c;用来平衡事物的隔离性&#xff08;Isolation&#xff09;和…

【安卓开发】Kotlin入门教程

一、Kotlin 基础入门 1.1 Kotlin 简介 Kotlin 是一种由 JetBrains 开发的静态类型编程语言&#xff0c;运行在 Java 虚拟机上&#xff0c;也可以编译为 JavaScript 或原生代码。它于 2017 年被 Google 宣布为 Android 官方开发语言。 主要特点&#xff1a; 简洁&#xff1a;…