【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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏彭湖湾的编程世界

【算法】实现栈和队列

栈(stack) 栈(stack)是一种后进先出(LIFO)的集合类型, 即后来添加的数据会先被删除 ? 可以将其类比于下面文件的取放操作:新到的文件会被先取走...

3446
来自专栏alexqdjay

angularjs源码笔记(5.1)--parse

2715
来自专栏Java帮帮-微信公众号-技术文章全总结

第十三天 面向对象-final static 匿名对象内部类包代码块【悟空教程】

1434
来自专栏大数据钻研

JavaScript 知识点整理

JavaScript是按照ECMAScript标准设计和实现的,后文说的JavaScript语法其实是ES5的标准的实现。 先说说有哪些基础语法? 最基础语法有...

2745
来自专栏C/C++基础

RTTI简介

RTTI是Runtime Type Identification的缩写,是“运行时类型识别”的意思。面向对象的编程语言,象C++,Java,Delphi都提供了...

923
来自专栏每日一篇技术文章

Foundation-String

最近写完了Swift 3.0教程 ,在接下来这段时间,继续写Foundation 的教程,帮助大家更加深入,系统的学习Foundation 框架,可能会持续一段...

1061
来自专栏超然的博客

ECMAScript 6 笔记(一)

       1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国...

1073
来自专栏技术博文

PHP中的Array2String & String2Array

在用PHP开发时我们有时期望将一个数组(任意多维),在页面之间传递或者存入数据库。这时我们可以将Array转换为String传递或保存,取出用的时候在转换回来即...

3987
来自专栏有趣的Python

慕课网-Linux C语言结构体-学习笔记

Linux C语言结构体 编译指令:预处理,宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 逻辑运算符:& | ^ ~ << >> 递归函...

4618
来自专栏cloudskyme

memset,memcpy,strcpy 的区别

一.函数原型    strcpy    extern char *strcpy(char *dest,char *src);    #include <stri...

37812

扫码关注云+社区

领取腾讯云代金券