Golang中面向对象的三大特性之多态的理解

多态:同一操作作用于不同对象,可以产生不同的行为,Go中通过接口实现。

比如:

Go 复制代码
// serializer/common.go
type Response struct {
    Status int         `json:"status"`
    Data   interface{} `json:"data"`  // interface{} 可以是任何类型
    Msg    string      `json:"msg"`
    Error  string      `json:"error"`
}

它的体现:

Go 复制代码
// 返回任务列表时
BuildListResponse(items []WaiCengTask, total uint) //返回任务列表时,data是dataList类型
// Data 是 DataList 类型

// 返回单个任务时
serializer.BuildTask(task)
// Data 是 WaiCengTask 类型

// 返回用户信息时
BuildUser(user)
// Data 是 User 类型

// 返回错误时
Response{Status: 400, Error: err.Error()}
// Data 是 nil

还有一种比如是说:gin框架的c.json-同一方法,不同数据

Go 复制代码
// api/task.go

// 场景1:返回任务列表
func ListTasks(c *gin.Context) {
    res := listService.List(chaim.Id, listService.Limit, listService.Start)
    c.JSON(200, res)  // 发送列表数据
}

// 场景2:返回创建成功消息
func CreateTask(c *gin.Context) {
    res := createService.Create(chaim.Id, createService.Title, createService.Content)
    c.JSON(200, res)  // 发送成功消息
}

// 场景3:返回错误信息
func ShowTask(c *gin.Context) {
    res := showTaskService.Show(c.Param("id"))
    c.JSON(200, res)  // 发送任务详情
}

最简单的例子就是:

先定义一个叫的接口

Go 复制代码
// 定义一个"叫"的接口
type Animal interface {
    Speak() string
}

其次,狗实现Animal:

Go 复制代码
type Dog struct{}

func (d Dog) Speak() string {
    return "汪汪汪"  // 狗的叫法
}

猫实现Animal:

Go 复制代码
type Cat struct{}

func (c Cat) Speak() string {
    return "喵喵喵"  // 猫的叫法
}

鸟实现Animal:

Go 复制代码
type Bird struct{}

func (b Bird) Speak() string {
    return "叽叽叽"  // 鸟的叫法
}

统一调用:

Go 复制代码
// 统一调用 Speak() 方法
func makeSpeak(animal Animal) {
    fmt.Println(animal.Speak())  // 不管是什么动物,都调用 Speak()
}

func main() {
    dog := Dog{}
    cat := Cat{}
    bird := Bird{}
    
    makeSpeak(dog)   // 输出: 汪汪汪
    makeSpeak(cat)   // 输出: 喵喵喵
    makeSpeak(bird)  // 输出: 叽叽叽
}
相关推荐
小江的记录本10 小时前
【Java基础】泛型:泛型擦除、通配符、上下界限定(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·mysql·spring·面试·职场和发展
落羽的落羽11 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
萑澈12 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl
geovindu12 小时前
go: Semaphore Pattern
开发语言·后端·设计模式·golang·企业级信号量模式
yuannl1013 小时前
数据结构----二叉排序树(ai修改版)
数据结构
iiiiyu14 小时前
集合进阶(Map集合)
java·大数据·开发语言·数据结构·编程语言
小江的记录本14 小时前
【Java基础】核心关键字:final、static、volatile、synchronized、transient(附《思维导图》+《面试高频考点清单》)
java·前端·数据结构·后端·ai·面试·ai编程
go不是csgo15 小时前
两个Redis数据结构搞定签到和UV统计:Bitmap与HyperLogLog实战
数据结构·redis·uv
dusk_star15 小时前
go语言--笔记--封装、组合(继承)
笔记·golang
悠仁さん15 小时前
数据结构 栈与队
数据结构