专栏首页Golang语言社区【Go 语言社区】面向对象

【Go 语言社区】面向对象

面向对象

Go是面向对象的,但没有如下概念:

  • class类
  • extends继承
  • implements实现

我们首先看看Go使用type来表达类型,type关键词定义了一个新的类型,声明作为一个struct,在struct中每个字段可以有一个名称(如下面的Name 和Main),或另外一个struct:

type weatherData struct {

Name string `json:"name"`

}

所有类型都是平等地创建,定义类型的方法是如下定义,不像Java中在Class中定义:

type Door struct {

opened bool

}

func (d *Door) Open() {

d.opened = true

}

func (d *Door) Close() {

d.opened = false

}

这是Door结构类型中有open()和close()两个方法。类似Java的setter/getter。

对于初始类型也可以这样创建:

type Door bool

func (d *Door) Open() {

*d = true

}

func (d *Door) Close() {

*d = false

}

这里是将初始类型bool赋值为true或fals的两个方法。

接口是Go语言的重要特点,其重要性超过协程,它和Java接口有些类似,如下:

In Java:

interface Switch {

void open();

void close();

}

In Go:

type OpenCloser interface {

Open()

Close()

}

与Java的接口不同的是,Go的接口是不需要显式声明继承的,它是隐式通过编译器根据方法签名匹配的,比如,在Java中实现接口Switch需要编写代码:

public class SwitchImpl implements Switch{ //实现具体内容}

而在Go中接口是隐式通过编译器实现的,前面type Door bool我们已经定义了Door这个类型有两个方法Open和Close,而这里有一个接口type OpenCloser interface申明了两个方法也是Open和Close,编译器也就认为Door implements OpenCloser了。

Go的接口与实现关系是一种隐式满足implicit satisfaction,如果一个类型type定义实现了一个接口的所有方法,那么就认为这个type满足了接口, 隐式满足Implicit satisfaction ==无显式 "implements"代码。它是一种duck typing的Structural subtyping,好处是:

  • 更少依赖
  • 不会造成纷繁类型继承层次
  • 天然的组合特性 非继承

从Go的接口我们看出Go是注重组合超过继承。

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-03-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 转--从面向对象的角度看Go语言与Java语言的区别

    Go语言风格 GO语言是支持并发编程和内存垃圾回收的编译型静态类型语言,运行效率高,具有较强的可伸缩性(scalable)。它是为软件工程服务而进行的语言设计,...

    李海彬
  • 棋牌游戏服务器架构: 详细设计(一) 内核设计

    内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口: ? 图1 IService接口 Start方法用来启动服务。 ...

    李海彬
  • 棋牌游戏服务器架构: 详细设计(一) 内核设计

    内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口: ? 图1 IService接口 Start方法用来启动服务。 ...

    李海彬
  • Jersey 2.x 分支 Java SE 兼容性

    https://www.cwiki.us/display/JERSEYZH/Java+SE+Compatibility

    HoneyMoose
  • Go 语言面向对象教程 —— 接口篇:接口赋值

    上篇教程我们介绍了接口定义及实现,和 PHP 一样,Go 语言的接口不支持直接实例化,只能通过实现类实现接口声明的所有方法,不过不同之处在于 Go 语言接口支持...

    学院君
  • Java大数据开发怎么学习比较好?

    另外,你也要考虑时间、精力、金钱等各方面的投入情况。学习和掌握大数据相关技术也非一朝一夕之事,不可能一蹴而就,一般的培训课程只能达到入门级别的介绍和讲解,真正要...

    加米谷大数据
  • 聊聊elasticsearch的PeerFinder

    elasticsearch-7.0.0/server/src/main/java/org/elasticsearch/discovery/PeersReques...

    codecraft
  • 图论碎碎念(2.2)

    狗子们开学(上班)快乐!有没有期待这一期的图论碎碎念呢?在本期开始之前,首先我们用数学语言把2.1的内容总结一下。

    艾木樨
  • 漫谈数据质量监控

    本篇分享一些和数据质量监控相关的内容。数据质量监控是一个在快速发展的业务中最容易被牺牲和忽略的功能,但是它确实至关重要的。

    zhisheng
  • Java基础知识点面试手册(线程+JDK8)

    在单核 CPU 中,将 CPU 分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用 CPU 的机制。

    Java3y

扫码关注云+社区

领取腾讯云代金券