golang学习笔记28——golang中实现多态与面向对象

文章目录

前言

Go 语言并不是传统意义上的面向对象编程语言,但它通过一些独特的方式实现了类似面向对象编程(OOP)的特性,其中包括多态的实现。本文将详细介绍在 Go 语言中如何实现多态以及面向对象相关概念。

Go 语言中的接口实现多态

在 Go 语言中,接口是实现多态的关键。接口定义了一组方法,但不实现这些方法。任何类型只要实现了接口中定义的所有方法,就被认为实现了该接口。

1.定义接口

以下是一个简单的接口定义:

golang 复制代码
type Shape interface {
    Area() float64
    Perimeter() float64
}

2.实现接口的结构体

我们定义两个结构体 Rectangle 和 Circle 并让它们实现 Shape 接口:

golang 复制代码
type Rectangle struct {
    width  float64
    height float64
}

func (r Rectangle) Area() float64 {
    return r.width * r.height
}

func (r Rectangle) Perimeter() float64 {
    return 2*(r.width + r.height)
}

type Circle struct {
    radius float64
}

func (c Circle) Area() float64 {
    return 3.14 * c.radius * c.radius
}

func (c Circle) Perimeter() float64 {
    return 2 * 3.14 * c.radius
}

3.多态的体现

通过接口类型的变量,我们可以调用不同实现类型的方法,这体现了多态性:

golang 复制代码
func main() {
    var s Shape

    r := Rectangle{width: 5, height: 3}
    s = r
    fmt.Println("Rectangle Area:", s.Area())
    fmt.Println("Rectangle Perimeter:", s.Perimeter())

    c := Circle{radius: 4}
    s = c
    fmt.Println("Circle Area:", s.Area())
    fmt.Println("Circle Perimeter:", s.Perimeter())
}

Go 语言中的面向对象特性

1.封装

在 Go 语言中,通过将结构体的字段小写(在 Go 中,小写字母开头的标识符在包外不可见)来实现封装,这样可以控制对内部数据的访问。例如:

golang 复制代码
package main

import "fmt"

type Person struct {
    name string
    age  int
}

func NewPerson(name string, age int) *Person {
    return &Person{name: name, age: age}
}

func (p *Person) GetName() string {
    return p.name
}

func (p *Person) SetName(newName string) {
    p.name = newName
}

func main() {
    p := NewPerson("Alice", 30)
    fmt.Println(p.GetName())
    p.SetName("Bob")
    fmt.Println(p.GetName())
}

2.组合代替继承

Go 语言没有继承的概念,而是通过组合来实现代码复用。例如:

golang 复制代码
type Animal struct {
    Name string
}

func (a *Animal) Move() {
    fmt.Printf("%s is moving\n", a.Name)
}

type Dog struct {
    Animal
    Breed string
}

func main() {
    dog := Dog{Animal{"Doubao"}, "Poodle"}
    dog.Move()
}

总结

虽然 Go 语言不是纯粹的面向对象语言,但它通过接口、封装和组合等特性,提供了一种灵活且高效的编程方式来实现多态和面向对象相关的编程模式。这些特性使得 Go 语言在复杂系统的构建中能够满足各种设计需求,同时保持了语言的简洁性和高效性。

希望这篇文章能够帮助大家更好地理解 Go 语言在多态和面向对象方面的实现方式。如果有任何疑问或者建议,请随时在评论区留言。

关注我看更多有意思的文章哦!👉👉

相关推荐
运维&陈同学26 分钟前
【Elasticsearch05】企业级日志分析系统ELK之集群工作原理
运维·开发语言·后端·python·elasticsearch·自动化·jenkins·哈希算法
ZHOUPUYU1 小时前
最新 neo4j 5.26版本下载安装配置步骤【附安装包】
java·后端·jdk·nosql·数据库开发·neo4j·图形数据库
Q_19284999062 小时前
基于Spring Boot的找律师系统
java·spring boot·后端
ZVAyIVqt0UFji3 小时前
go-zero负载均衡实现原理
运维·开发语言·后端·golang·负载均衡
SomeB1oody4 小时前
【Rust自学】4.1. 所有权:栈内存 vs. 堆内存
开发语言·后端·rust
PP东4 小时前
ES6学习Generator 函数(生成器)(八)
javascript·学习·es6
AI人H哥会Java6 小时前
【Spring】Spring的模块架构与生态圈—Spring MVC与Spring WebFlux
java·开发语言·后端·spring·架构
小屁不止是运维6 小时前
麒麟操作系统服务架构保姆级教程(二)ssh远程连接
linux·运维·服务器·学习·架构·ssh
毕设资源大全6 小时前
基于SpringBoot+html+vue实现的林业产品推荐系统【源码+文档+数据库文件+包部署成功+答疑解惑问到会为止】
java·数据库·vue.js·spring boot·后端·mysql·html
Watermelon_Mr6 小时前
Spring(三)-SpringWeb-概述、特点、搭建、运行流程、组件、接受请求、获取请求数据、特殊处理、拦截器
java·后端·spring