一文详解Go的面向对象编程
偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《一文详解Go的面向对象编程》,这篇文章主要会讲到对象、面向等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!
概述
Go语言的面向对象编程有三个重要的思想:封装、继承和多态。
- 封装
Go 语言通过 struct 结构体的方式来实现封装,结构体可以包含各种类型的变量和方法,可以将一组相关的变量和方法封装在一起。使用首字母大小写控制变量和方法的访问权限,实现了信息隐藏和访问控制。
- 继承
Go 语言中没有传统的继承机制,但是可以使用嵌入式类型来实现类似继承的效果,将一个类型嵌入到另一个类型中,从而继承嵌入类型的方法和属性。嵌入式类型的特点是可以直接访问嵌入类型的属性和方法,不需要通过接口或者其他方式进行转换。在 Go 语言中,可以通过 struct 嵌套和 interface 嵌套来实现继承的效果。
- 多态
Go 语言通过接口来实现多态,一个类型只需要实现了接口的所有方法,就可以被赋值给该接口类型的变量。这样可以实现类似于面向对象语言中的多态性。多态性使得程序可以根据上下文环境自动选择合适的方法实现,提高了代码的灵活性和可复用性。
实战
常规函数写法
在这个示例中,函数和结构体是分离的,函数接收结构体指针类型作为参数,需要手动传递结构体的指针。尽管这种方式有一定的缺陷,调用会比较麻烦,但它更加符合基于过程式编程思想的设计理念,即将一个大问题拆分成多个小问题,并通过函数解决这些小问题。适用于初学者对于代码的简单操作。优点就只有易于理解。
package test
import (
"fmt"
"testing"
)
type Mobile struct {
User string `json:"user"`
Brand string `json:"brand"`
Prise float64 `json:"prise"`
}
func CallUp(m *Mobile) {
fmt.Printf("%s is using ?%.2f mobile phone to make a call.\n", m.User, m.Prise)
}
func Storage(m *Mobile) {
fmt.Printf("%s is using a %s mobile phone to transfer data.\n", m.User, m.Brand)
}
func Charge(m *Mobile) string {
return fmt.Sprintf("%s is charging a %s phone.\n", m.User, m.Brand)
}
func Game(m *Mobile, name string) {
fmt.Printf("%s is playing the game of '%s'.\n", m.User, name)
}
func TestExample(t *testing.T) {
iPhone := Mobile{
User: "Tom",
Brand: "iPhone 15 Pro MAX",
Prise: 12688.00,
}
CallUp(&iPhone)
Game(&iPhone, "Card")
Storage(&iPhone)
fmt.Printf(Charge(&iPhone))
}调用结构体类型上的方法
调用结构体类型上的方法体现了面向对象编程的封装思想。封装的核心是将数据和行为打包在一起,通过公开和私有的方式来隐藏实现细节。这样可以使得代码更加模块化、安全、易于维护,并且更加符合现实世界中的抽象模型。
相比于上面的函数调用,调用结构体类型上的方法可以使调用方法时不必手动传递结构体实例对象,只需聚焦于方法参数本身,提高了代码的可读性和易用性。这也符合面向对象编程的简洁性和代码重用性的思想。
? 提示:在代码注释中类比了 Python 中类的写法。
package test
import (
"fmt"
"testing"
)
// class Mobile(object)
type Mobile struct {
User string `json:"user"`
Brand string `json:"brand"`
Prise float64 `json:"prise"`
}
// def __init__(user, brand, prise)
func NewMobile(user string, brand string, prise float64) *Mobile {
return &Mobile{User: user, Brand: brand, Prise: prise}
}
// def call_up(self)
func (m *Mobile) CallUp() {
fmt.Printf("%s is using ?%.2f mobile phone to make a call.\n", m.User, m.Prise)
}
// def storage(self)
func (m *Mobile) Storage() {
fmt.Printf("%s is using a %s mobile phone to transfer data.\n", m.User, m.Brand)
}
// def charge(self)
func (m *Mobile) Charge() string {
return fmt.Sprintf("%s is charging a %s phone.\n", m.User, m.Brand)
}
// def game(self, name)
func (m *Mobile) Game(name string) {
fmt.Printf("%s is playing the game of '%s'.\n", m.User, name)
}
func TestExample(t *testing.T) {
applePhone := NewMobile("Tom", "iPhone 15 Pro MAX", 12688.00)
applePhone.CallUp()
applePhone.Game("Card")
applePhone.Storage()
fmt.Printf(applePhone.Charge())
}调用接口类型上的方法
接口实例: 是指定义一个接口类型,并将具体的结构体类型的实例传递给它。
调用接口类型上的方法,将接口与结构体类型分开,使接口具有更广泛的适用性。使用 “接口实例” 可以实现更灵活的代码设计,因为可以在运行时动态地选择要使用的实现类型。
同时,由于接口只关心方法的签名,而不关心具体实现方式,因此可以将不同的结构体类型传递给同一个接口,从而实现面向对象思想的多态性。
在这个示例中,定义了一个 USB 接口和 PlayBoy 接口,它们都包含各自的方法。在测试函数中调用这两个接口的方法时需要分别调用。这两个接口之间没有直接的联系或关联,它们是相互独立的。如果你想将这两个接口组合在一起,可以使用 “嵌入式接口”。
package test
import (
"fmt"
"testing"
)
var (
applePhone, huaweiPhone *Mobile
)
func init() {
applePhone = NewMobile("Tom", "iPhone 15 Pro MAX", 12688.00)
huaweiPhone = NewMobile("John", "Huawei Meta 40 Pro", 8888.00)
}
type USB interface {
Storage()
Charge() string
}
type PlayBoy interface {
Game(name string)
}
type Mobile struct {
User string `json:"user"`
Brand string `json:"brand"`
Prise float64 `json:"prise"`
}
func NewMobile(user string, brand string, prise float64) *Mobile {
return &Mobile{User: user, Brand: brand, Prise: prise}
}
func (m *Mobile) CallUp() {
fmt.Printf("%s is using ?%.2f mobile phone to make a call.\n", m.User, m.Prise)
}
func (m *Mobile) Storage() {
fmt.Printf("%s is using a %s mobile phone to transfer data.\n", m.User, m.Brand)
}
func (m *Mobile) Charge() string {
return fmt.Sprintf("%s is charging a %s phone.\n", m.User, m.Brand)
}
func (m *Mobile) Game(name string) {
fmt.Printf("%s is playing the game of '%s'.\n", m.User, name)
}
func TestExample(t *testing.T) {
USB.Storage(applePhone)
fmt.Printf(USB.Charge(huaweiPhone))
PlayBoy.Game(huaweiPhone, "LOL")
}嵌入式接口
嵌入式接口: 是一种将一个接口嵌入到另一个接口中的技术,嵌入的接口中的所有方法都会被继承到当前接口中。通过接口的嵌套,可以将多个接口组合成一个更大的接口,从而使代码更加简洁、灵活。这也体现了面向对象编程中的继承特性。
在这个示例中,定义了一个 IPhone 接口,它嵌入了 USB 接口和 PlayBoy 接口,以及 CallUp() 方法。 从而可以使用这三个接口中的所有方法。通过这种方式,我们可以将不同的接口组合成一个更大的接口,以便更方便地使用这些方法。在测试函数中,我们创建了一个 Mobile 类型的实例,并将其转换为 IPhone 类型的接口实例 p,然后可以使用 p 调用 Mobile 结构体中实现的 CallUp()、Game()、Storage() 和 Charge() 方法。
package test
import (
"fmt"
"testing"
)
type IPhone interface {
USB
PlayBoy
CallUp()
}
type USB interface {
Storage()
Charge() string
}
type PlayBoy interface {
Game(name string)
}
type Mobile struct {
User string `json:"user"`
Brand string `json:"brand"`
Prise float64 `json:"prise"`
}
func (m *Mobile) CallUp() {
fmt.Printf("%s is using ?%.2f mobile phone to make a call.\n", m.User, m.Prise)
}
func (m *Mobile) Storage() {
fmt.Printf("%s is using a %s mobile phone to transfer data.\n", m.User, m.Brand)
}
func (m *Mobile) Charge() string {
return fmt.Sprintf("%s is charging a %s phone.\n", m.User, m.Brand)
}
func (m *Mobile) Game(name string) {
fmt.Printf("%s is playing the game of '%s'.\n", m.User, name)
}
func TestExample(t *testing.T) {
newMobile := &Mobile{User: "John", Brand: "Huawei Meta 40 Pro", Prise: 8888.00}
var p IPhone = newMobile
p.CallUp()
p.Game("Card")
p.Storage()
fmt.Printf(p.Charge())
}本篇关于《一文详解Go的面向对象编程》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!
Redis链表底层实现及生产实战
- 上一篇
- Redis链表底层实现及生产实战
- 下一篇
- Redis批量删除key的命令详解
-
- Golang · Go教程 | 4小时前 | 格式化输出 printf fmt库 格式化动词 Stringer接口
- Golangfmt库用法与格式化技巧解析
- 140浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Golang配置Protobuf安装教程
- 147浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Golang中介者模式实现与通信解耦技巧
- 378浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Golang多协程通信技巧分享
- 255浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Golang如何判断变量类型?
- 393浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Golang云原生微服务实战教程
- 310浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Golang迭代器与懒加载结合应用
- 110浏览 收藏
-
- Golang · Go教程 | 5小时前 | 性能优化 并发安全 Golangslicemap 预设容量 指针拷贝
- Golangslicemap优化技巧分享
- 412浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Golang代理模式与访问控制实现解析
- 423浏览 收藏
-
- Golang · Go教程 | 6小时前 |
- Golang事件管理模块实现教程
- 274浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3164次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3376次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3405次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4509次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3785次使用
-
- go对象池化组件bytebufferpool使用详解
- 2022-12-22 451浏览
-
- go语言中的面向对象
- 2022-12-29 336浏览
-
- golang 对象深拷贝的常见方式及性能
- 2022-12-28 262浏览
-
- 如何go语言比较两个对象是否深度相同
- 2023-01-07 236浏览
-
- golang中接口对象的转型两种方式
- 2023-02-24 247浏览

