概述

Golang语言的面向对象与c++,py等语言有所不同,是由于Golang不支持继承;与上述支持聚合和继承的面向对象的语言不同,Golang只支持聚合(也叫做组合)和嵌入。聚合和嵌入的区别:

type ColoredPoint struct {
color.Color //匿名字段(嵌入)
x, y int //具名字段(聚合)
}
warning:(point := ColoredPoint{})
字段访问:
point.x , point.y, point.Color [当访问来自于其他pkg的类型字段时候,只用到了其名字的最后一部分]

在传统面向对象的编程中,“类(class)", "对象(object)", "实例(instance)"被定义了很清晰。在Golang完全没有这些术语,而是使用"类型(type)" 和 "值(value)"来取代,其中自定义类型的值可以包含方法;

由于Golang中没有继承,也就没有虚函数。Golang对此的支持采用类型安全的鸭子类型(duck type)。简单概况为:在Golang中,参数可以被声明为一个具体类型(例如int,string,或者*os.File 以及MyType),也可以是接口(interface),即提供了具有满足该接口的方法的值。

对于一个声明为接口的参数,可传入任意值,只要该值包含该接口所声明的方法。无论该值的实际类型是什么;

这点异常灵活强大,特别是与Golang所支持的访问嵌入字段的方法相结合时;

取代继承

继承的优势是,有些方法在基类中实现一次,子类中即可使用;Golang为此提供了两个解决方案:

  • 使用嵌入; 嵌入一个类型,方法值需要在所嵌入的类型中实现一次,即可在所有包含该嵌入类型的类型中使用;
  • 为每一种类型提供独立的方法; 简单地包装功能性作用的代码放进一个函数中,然后让所有类的方法都调用这个函数;

Golang Interface

Golang面向对象编程中另一个与众不同点是它的接口,值和方法都保持独立。

  • 接口用于声明方法签名
  • 结构体用于声明聚合或者嵌入的值
  • 方法用于声明在自定义类型(通常为结构体)上的操作

在自定义类型的方法和任何特殊接口之间没有显示的联系。但如果该类型的方法满足一个或多个接口,那么该类型的值可以用于任何接受该接口的值的地方。当然,每一个类型都满足空接口(interface{}), 因此任何值都可以用于声明了空接口的地方;

type Exchanger interface{
Exchange()
}
根据Golang的惯例,定义接口时接口名需以er结尾 type StringPair struct{
first string
second string
}
打印自定义类型,简单地添加一个满足fmt.Stringer接口的方法可实现:
func (pair StringPair)String() string{
return fmt.Sprintf("%q + %q", pair.first, pair.second)
} func (pair *StringPair) Exchange(){
pair.first, pair.second = pair.second, pair.first
} func exchangeThese(exchangers ...Exchanger){
for _, exchanger := range exchangers{
exchanger.Exchange()
}
} //chris := StringPair{"chris", "paul"}
//exchangeThese(&chris) #此处必须显式的传入地址,如果传入StringPair类型的值,Go编译器发现StringPair类型并不能满足Exchanger接口,因为StringPair接受者上并未定义方法,从而停止编译并报告错误;然而,我们传入*StringPair则编译成功,之所以这样,因为有一个接受*StringPair接受者的方法Exchange(),也表示*StringPair满足Exchanger接口;

Golang并发编程

正常退出goroutine

  • 当程序完成时没有得到任何结果。当主goroutine退出后,其他的工作goroutine也会自动退出,必须保证所有工作goroutine都完成后才能让主goroutine退出;
  • 死锁:即所有工作都完成了,但主goroutine和工作goroutine还存活,这种情况通常是由于工作完成了但主goroutine无法获得工作goroutine的完成状态。另一种情况则是当两个不同的goroutine都锁定了受保护的紫玉而且同时尝试获取对方资源;

为了避免程序提前退出或不能正常退出,常见的做法是让主goroutine在一个done通道上等待,根据接收的消息来判断工作是否完成;

在通道里传输布尔类型、整型或者float64类型的值都是安全的,因为它们都是通过copy的方式来传送的,所以在并发时如果多个goroutine都访问了一个值,这也没有什么问题,同样,发送字符串也是安全的,因为Golang里不允许修改字符串;

Golang中不保证在通道里发送指针或者引用类型(切片或者map)的安全性,因为指针指向的内容或者所引用的值可能在对方接收时已被发送发修改。所以,当涉及到指针和引用时,必须保证这些值在任何时候都只能被一个goroutine访问得到。也就是说[对这些值的访问必须是串行的];

除非文档中特别指明这个指针是安全的,比如:*regexp.Regexp可以同时被多个goroutine访问,因为这个指针指向的值的所有方法都不会修改这个值的状态;

golang 面向对象编程的更多相关文章

  1. Golang面向对象编程-struct(结构体)

    Golang面向对象编程-struct(结构体) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是面向对象编程 面向对象编程(Object Oriented Program ...

  2. 【GoLang】golang 面向对象编程 & 面向接口编程

    005.面向对象&接口编程 1 面向函数编程 1.1 将数据作为参数传递到函数入参 1.2 对象与函数是分离的 2 面向对象编程 2.1 使用者看起来函数作为对象的属性而非参数 2.2 函数属 ...

  3. golang之面向对象编程

    1.Golang语言面向对象编程说明 1)Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.所以我们说Golang支持面向对象编程特性是比较准确的. ...

  4. golang面向对象和interface接口

    一. golang面向对象介绍 1.golang也支持面向对象编程,但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.2.golang没有类(class),golang语言的结合体(struc ...

  5. Go语言基础之结构体(面向对象编程上)

    1 自定义类型和类型别名 1.1 自定义类型 Go语言中可以基于一些基本的数据类型,使用type关键字定义自定义类型的数据 . 自定义类型定义了一个全新的类型,该新类型具有基本数据类型的特性.自定义类 ...

  6. Go语言基础之面向对象编程中

    1 Golang面向对象编程基本介绍 Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OPP语言不一样,随后分别介绍Golang对面向对象编程的三大特性是如何实现的. 2 ...

  7. Golang核心编程

    源码地址: https://github.com/mikeygithub/GoCode 第1章 1Golang 的学习方向 Go 语言,我们可以简单的写成 Golang 1.2Golang 的应用领域 ...

  8. Golang的面向对象编程【结构体、方法、继承、接口】

    Golang也支持面向对象编程.但与以前学过传统的面向对象编程语言有区别.1)Golang没有类class,Go语言的结构体struct和类class有相似的特性.2)Golang中不存在继承,方法重 ...

  9. GO语言的进阶之路-面向对象编程

    GO语言的进阶之路-面向对象编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当你看完这篇文章之时,我可以说你的Golang算是入门了,何为入门?就是你去看Docker 源码能看 ...

随机推荐

  1. [转] 插件兼容CommonJS, AMD, CMD 和 原生 JS

    模块标准 CommonJS CommonJS 有三个全局变量 module.exports 和 require.但是由于 AMD 也有 require 这个全局变量,故不使用这个变量来进行检测. 如果 ...

  2. Python接收执行参数

    1.python内置模块sys的sys.argv函数会将解释器执行时的所有参数保存为一个列表. a.首先创建文件login.py #!/usr/bin/env python #-*- coding:u ...

  3. python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)

    python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...

  4. 001.LVS简介及算法

    一 LVS简介 1.1 LVS介绍 LVS是linux virtual server的简写linux虚拟服务器,是一个虚拟的服务器集群系统,可以再unix/linux平台下实现负载均衡集群功能. 使用 ...

  5. dns 监控系统 设计 dns安全威胁的可视化。

    基于DNS大数据分析实现宽带共享监控系统.实现对宽带用户进行有效管理. 本系统基于DNS大数据分析实现宽带共享监控系统,包括以下方面. 1)数据采集:数据采集过程是通过探针采集的方式,从各地市的DNS ...

  6. iptables转发端口

    1.本机端口转发 把发往本机80端口的数据重定向到8080端口 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-por ...

  7. Bracket 使用指南

    Brackets 是一个免费.开源且跨平台的 HTML/CSS/JavaScript 前端 WEB 集成开发环境 (IDE工具).该项目由Adobe 创建和维护,根据MIT许可证发布,支持 Windo ...

  8. 使用 SHOW STATUS 查看mysql 服务器状态信息

    在LAMP架构的网站开发过程中,有些时候我们需要了解MySQL的服务器状态信息,譬如当前MySQL启动后的运行时间,当前MySQL的客户端会话连接数,当前MySQL服务器执行的慢查询数,当前MySQL ...

  9. Codeforces Round #408 (Div. 2) 题解【ABCDE】

    A - Buying A House 题意:给你n个房间,妹子住在第m个房间,你有k块钱,你想买一个离妹子最近的房间.其中相邻的房间之间距离为10,a[i]=0表示已经被别人买了. 题解:扫一遍更新答 ...

  10. File构建实例的路径:绝对路径和相对路径

    public static void main(String[] args) throws Exception { File file = new File("bin/dyan.txt&qu ...