我们总结一下前面看到的:Go 没有类,而是松耦合的类型、方法对接口的实现。

面向对象语言最重要的三个方面分别是:封装继承多态,在 Go 中它们是怎样表现的呢?

Go实现面向对象的两个关键是structinterface,结构代替类,因为Go语言不提供类,但提供了结构体或自定义类型,方法可以被添加到结构体或自定义类型中。结构体之间可以嵌套,类似继承。而interface定义接口,实现多态性。

封装(数据隐藏)

和别的面向对象语言有 4 个或更多的访问层次相比,Go 把它简化为了 2 层:

  • 包范围内的:通过标识符首字母小写,对象只在它所在的包内可见

  • 可导出的:通过标识符首字母大写,对象对所在包以外也可见

继承

Go没有显式的继承,而是通过组合实现继承,内嵌一个(或多个)包含想要的行为(字段和方法)的结构体;多重继承可以通过内嵌多个结构体实现。

多态

多态是运行时特性,而继承则是编译时特征,也就是说,继承关系在编译时就已经确定了,而多态则可以实现运行时的动态绑定。Go用接口实现多态,某个类型的实例可以赋给它所实现的任意接口类型的变量。类型和接口是松耦合的,并且多重继承可以通过实现多个接口实现。Go 接口不是 Java 和 C# 接口的变体,而且,接口间是不相关的,并且是大规模编程和可适应的演进型设计的关键。

另外Go没有构造函数,如果一定要在初始化对象的时候进行一些工作的话,可以自行封装产生实例的方法。实例化的时候可以初始化属性值,如果没有指明则默认为系统默认值。加&符号和new的是指针对象,没有的则是值对象,在传递对象的时候要根据实际情况来决定是要传递指针还是值。

多重继承

多重继承指的是类型获得多个父类型行为的能力,它在传统的面向对象语言中通常是不被实现的(C++ 和 Python 例外)。因为在类继承层次中,多重继承会给编译器引入额外的复杂度。但是在 Go 语言中,通过在类型中嵌入所有必要的父类型,可以很简单的实现多重继承

有关方法重载就是一个类中可以有相同的函数名称,但是它们的参数是不一致的,在java、C++中这种做法普遍存在。Go中如果尝试这么做会报重新声明(redeclared)错误,但是Go的函数可以声明不定参数,这个非常强大。

func Println(a ...interface{}) (n int, err error) {
return Fprintln(os.Stdout, a...)
}

其中a ...interface{}表示参数不定的意思。如果要根据不同的参数实现不同的功能,要在方法内检测传递的参数。

『GoLang』面向对象的更多相关文章

  1. 『Golang』Martini框架入门

    本文介绍golang中的优秀web开发框架martini! 序 Martini框架是使用Go语言作为开发语言的一个强力的快速构建模块化web应用与服务的开发框架.Martini是一个专门用来处理Web ...

  2. 『Golang』MongoDB在Golang中的使用(mgo包)

    有关在Golang中使用mho进行MongoDB操作的最简单的例子.

  3. 『Golang』在Golang中使用json

    由于要开发一个小型的web应用,而web应用大部分都会使用json作为数据传输的格式,所以有了这篇文章. 包引用 import ( "encoding/json" "gi ...

  4. 『Golang』—— 标准库之 os

    Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ...

  5. 『GoLang』fmt包的使用

    目录 1. fmt 包初识 2. 格式化 verb 应用 2.1 通用 2.2 布尔值 2.3 整数 2.4 浮点数与复数 2.5 字符串和 []byte 2.6 指针 2.7 其他 flag 2.8 ...

  6. 『GoLang』string及其相关操作

    目录 1. 字符串简介 2. 字符串的拼接 3. 有关 string 的常用处理 3.1 strings 包 3.1.1 判断两个 utf-8 编码字符串是否相同 3.1.2 判断字符串 str 是否 ...

  7. 『GoLang』接口

    接口是什么 Go 语言不是一种 "传统" 的面向对象编程语言:它里面没有类和继承的概念. 但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性.接口提供了一 ...

  8. 『GoLang』结构体与方法

    结构体 结构体类型 Go 通过结构体的形式支持用户自定义类型,或者叫定制类型. Go 语言结构体是实现自定义类型的一种重要数据类型. 结构体是复合类型(composite types),它由一系列属性 ...

  9. 『GoLang』函数

    函数介绍 Go语言函数基本组成包括: 关键字func 函数名 参数列表 返回值 函数体 返回语句 语法如下: func 函数名(参数列表) (返回值列表) { // 函数体 return } 除了ma ...

随机推荐

  1. 题解 P3322 [SDOI2015]排序

    题解 仔细审题,我们会发现 小 \(A\) 认为两个操作序列不同,当且仅当操作个数不同,或者至少一个操作不同(种类不同或者操作位置不同). 所以,对于一种操作,不管是交换哪两段,都算作同一种操作,只会 ...

  2. Linux md5sum校验文件完整性

    使用场景:  远程备份大文件,防止网络异常断开,文件备份不完整,使用md5校验其完整性. 1. 获取文件md5值 [root@kvm-123 gitlab]# md5sum 1564248991_20 ...

  3. flutter canvas圆圈转圈动画

    import 'dart:math'; import 'dart:ui'; import 'package:flutter/material.dart'; void main() => runA ...

  4. qt 中的QlistWidget

  5. 详解 Interpolator动画插值器

    Interpolator 被用来修饰动画效果,定义动画的变化率.在Android源码中对应的接口类为TimeInterpolator,通过输入均匀变化的0~1之间的值,可以得到匀速.正加速.负加速.无 ...

  6. centos6.10下安装mysql8.0.16root密码修改的坑

    上图截取别人的自己懒得弄,检查自己的linux是否有安装就按上图做就行了 接下来是我的干货 mysql8.0安群策略对密码设置很严格规则:大小写加数字和特殊字符串 使用yum安装mysql 后 my. ...

  7. ES6 class——音乐播放器实例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 学习小记: Kaggle Learn - Machine Learning Explainability

    Method Feature(s) Sample(s) Result Value/Feature Permutation Importance 1 all validation samples Sin ...

  9. JavaScript高级程序设计学习笔记之事件

    1.事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播 ...

  10. Excel 列名转int索引(C#版)

    /// <summary> /// 获取Excel实际列索引 /// </summary> /// <param name="columnName"& ...