博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go面向对象编程
阅读量:7250 次
发布时间:2019-06-29

本文共 2230 字,大约阅读时间需要 7 分钟。

Go并不是一个类似于Java、C++,或PHP这样内置面向对象语法的操作的语言,在Go里面名义上是没有类(class)这个概念的,但是这并不代表Go不能面向对象,毕竟面向对象只是一种设计思想!

为什么Go并不原生支持面向对象呢?这是一个问题

接下来,我会从面向对象的三大特性封装、继承、多态这个几个方面来讲讲Go是怎么实现的OOP的。

1.封装

闲话少说,在Go里面可以使用结构体模拟类:

type Goods struct {    name  string    price int}复制代码

在Go里面有一个约定俗称的规则,变量名、结构体名、结构体属性成员名大写代表是公开权限,可以被其它包使用。类似于类的public属性。如果小写就类似于private属性。

类里面除了属性之外,一般会有自己的方法,在Go里面可以这样实现(这里我采用的是Go modules结构):

package modelsimport "fmt"type Goods struct {    Name  string    Price int}func (g *Goods) GetName() string {    return g.Name}func (g *Goods) SetName(name string) {    g.Name = name}func (*Goods) String() {    fmt.Println("I am Goods")}复制代码

其实就是在函数名前加一个类型声明,如果你在方法里面不需要使用类本身,则可以省略参数标识。

如何使用这个“类呢”?

package mainimport (    "demo/models"    "fmt")func main() {    goods := models.Goods{        "笔记本", 100,    }        fmt.Printf("Goods name is %s\n", goods.GetName())        goods.SetName("小米笔记本")        fmt.Printf("Goods name is %s\n", goods.GetName())}复制代码

我们可以采用字面量赋值的方式初始化对象,虽然结构体并没有构造函数这个东西,但是我们可以造个差不多的方式出来。

新增这个方法:

func NewGoods(name string, price int) Goods {    g := Goods{        Name:  name,        Price: price,    }    return g}复制代码

然后我们就可以这样使用:

var goods models.Goodsgoods = models.NewGoods("笔记本", 1000)复制代码

其实区别倒是不大,封装了一下,更加简洁,虽然达不到构造函数自动调用的效果。

2.继承

Go里面并没有extends这样的语法,但是结构体的成员可以是结构体,这实际上是使用组合实现了继承的效果。

package modelstype Apple struct {    Goods //继承了Goods    Color string}// 构造函数func NewApple(name string, price int, color string) Apple {    apple := Apple{        Goods{name, price},        color,    }        return apple}复制代码

main.go:

package mainimport (    "demo/models"    "fmt")func main() {    apple := models.NewApple("红富士苹果", 200, "red")    fmt.Printf("Apple name is %s", apple.GetName())}复制代码

Apple可以使用Goods的方法和属性,使用组合的好处就是不存在多继承的限制,在很多面向对象的语言里面,只能单继承。

3.多态

虽然Go里面也没有implements这样的关键字,但是在Go里面可以使用interface来实现多态效果,而且Go里面的接口相当灵活。

定义接口:

package modelstype Saleable interface {    Sell()}复制代码

实现接口(Apple):

func (Apple) Sell()  {    fmt.Println("我实现了saleable接口")}复制代码

使用:

func main() {    apple := models.NewApple("红富士苹果", 200, "red")        var i models.Saleable        i = &apple        i.Sell()}---结果---我实现了saleable接口复制代码

划重点,在GO里面只要一个结构体(struct)定义了一个接口(interface)里面的所有方法,就意味着这个这个struct实现了这个接口,这是隐式的。可见,在Go里面接口还是挺好用的。

转载地址:http://oahbm.baihongyu.com/

你可能感兴趣的文章
JS 设计模式二(封装)
查看>>
JavaScript “跑马灯”抽奖活动代码解析与优化(一)
查看>>
为什么我们选择 segmentfault 写作?
查看>>
多模型融合推荐算法在达观数据的运用
查看>>
JDK 11 马上就要来了!JDK 12 还会远吗?
查看>>
Kali Linux 2019.1 发布,Metasploit 更新到 5.0 版本
查看>>
【mysql的设计与优化专题(1)】ER图,数据建模与数据字典
查看>>
Jibo’s Name: How did we pick it?
查看>>
device's media capture mechanism,利用input:file调用设备的照相机/相册、摄像机、录音机...
查看>>
BroadLink:三款新品力求无障碍人机交互,三大平台分三期对外开放 ...
查看>>
掌门1对1获3.5亿美元E-1轮融资,华人文化产业基金、中金甲子基金等投资 ...
查看>>
Unity中的通用对象池
查看>>
ORA-00600: internal error code, arguments: [16703], [1403], [28], [...
查看>>
忆芯科技发布新一代国产主控芯片STAR1000P!4月完成量产版本 ...
查看>>
如何用条码标签打印软件实现商品价签制定会员价 ...
查看>>
如何轻松实现个性化推荐系统
查看>>
Mysql高级查询 内连接和外连接详解
查看>>
基于AWS的电子商务网站架构——Web前端
查看>>
基于险企传统资源优势的“一核三环”规划——互联网平台建设
查看>>
社交网络:有意义的不仅是邓巴数
查看>>