5.Go-封装、继承、接口、多态和断言
面向对象
Go语言开发者认为:面向对象就是特定类型(结构体)有着自己的方法,利用这个方法完成面向对象编程,
并没有提封装、继承、多态。所以Go语言进行面向对象编程时,重点在于灵活使用方法。
Go语言有着自己对面向对象的理解,它也有着自己的封装、继承、多态。
5.1.封装
实例
//Learn_Go/main.go
package main import (
"fmt"
) type People struct {
name string
age int
} func (p *People) SetName(name string) {
p.name = name
} func (p *People) SetAge(age int) {
p.age = age
} func (p *People) GetName() string{
return p.name
} func (p *People) GetAge() int{
return p.age
} func main() {
peo := new(People)
peo.SetName("derek")
peo.SetAge(22)
fmt.Println(peo.GetName(),peo.GetAge()) //derek 22
}
5.2.继承
//Learn_Go/main.go
package main import "fmt" type People struct {
name string
age int
} type Teacher struct {
People
classroom string
} func main() {
tea := Teacher{People{"derek",22},"911"}
fmt.Println(tea.classroom,tea.name,tea.age) //911 derek 22
}
5.3.接口
接口是一组行为规范的定义
接口中只能有方法声明,方法只能有名次、参数、返回值,不能有方法体
每个接口中可以有多个方法,结构体把接口总所有方法都重写后,结构体就属于接口类型
Go语言中接口和结构体之间的关系是传统面向对象中is-like-a的关系
//Learn_Go/main.go
package main import "fmt" type Live interface {
run(i int)
eat(thing string)
} type People struct {
name string
} func (p *People) run(i int) {
fmt.Println(p.name,"跑了",i,"米")
} func (p *People) eat(thing string) {
fmt.Println(p.name,"正在吃",thing)
} func main() {
peo := People{"derek"}
peo.run(100)
peo.eat("面包")
}
5.4.多态
多态:同一件事情由于条件不同产生的结果不同
由于go语言中结构体不能相互转换,所以没有结构体的多态,只有基于接口的多态
//Learn_Go/main.go
package main import "fmt" type Live interface {
run()
} type People struct {
name string
} type Animal struct {
name string
} func (p *People) run() {
fmt.Printf("%v在跑步",p.name)
} func (a *Animal) run() {
fmt.Printf("%v在跑步",a.name)
} func allrun(live Live) {
live.run()
} func main() {
//接口不能实例化,只能对接口的结构体实例化
peo := &People{"derek"}
allrun(peo) //derek在跑步
//多态,条件不同结果不同
a := &Animal{"小狗"}
allrun(a) //小狗在跑步
}
5.5.断言
只要实现了接口的全部方法认为这个类型属于接口类型,如果编写一个接口,这个接口没有任何
方法,这是认为所有类型都是了这个接口,所以Go语言中interface{}代表任意类型
如果interface{]作为方法参数就可以接受任意类型,但是在程序中有时有需要知道这个参数
到底是什么类型,这个时候就需要使用断言
(1)断言可以有一个返回值,如果判断结果是指定类型返回变量值,否则报错
//Learn_Go/main.go
package main import "fmt" func main() {
var i interface{} = 44 //i是int类型
result1 := i.(int)
fmt.Println(result1) //44 result2 := i.(string)
fmt.Println(result2) //panic: interface conversion: interface {} is int, not string
}
(2)可以查看值的类型
//Learn_Go/main.go
package main import "fmt" func main() {
var i interface{} = 44 //i是int类型
result,ok := i.(int)
fmt.Println(result,ok) //44 true
fmt.Printf("%T",result) //int
}
(3)通过断言判断值的类型
//Learn_Go/main.go
package main import "fmt" func demo(i interface{}) {
_,ok := i.(int)
if ok{
fmt.Println("参是int类型")
return
}
_,ok = i.(string)
if ok{
fmt.Println("参是string类型")
return
}
fmt.Println("参数类型不确定,不是int和string类型")
} func main() {
demo(8) //参是int类型
demo("derek") //参是string类型
demo(3.146) //参数类型不确定,不是int和string类型
}
5.Go-封装、继承、接口、多态和断言的更多相关文章
- day33 序列类型,绑定方法,类方法,静态方法,封装继承和多态
Python之路,Day20 = 序列类型,绑定方法,类方法,静态方法,封装继承和多态 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要 ...
- Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现
前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...
- objective-c自学总结(三)---面向对象的封装,继承与多态
面向对象的三大特性 封装 继承 多态 1.封装: 隐藏属性,方法或实现细节的过程称为封装 信息隐藏,隐藏对象的实现细节,不允许用户看到 将东西包装在一 然后以新的完整形式呈现出来 例如,两种或多种化学 ...
- C++之封装继承和多态
C++中非常重要的概念,尤其是相对于C语言而言,也是其具有如此高的工程使用性的重要原因. 封装 所谓封装是将某些东西隐藏起来,让外界无法直接使用,而必须通过某些特定的方式才能访问.也即是,将抽象得到的 ...
- Java的封装继承和多态
封装 定义:属性私有private:get/set 目的 提高程序的安全性,保护数据 隐藏代码的实现细节 统一接口 提高系统的可维护性 代码 public class Student { //名字 p ...
- java封装继承以及多态(含代码)
封装 该露的露,该藏的藏 我们常需设计要追求,"高内聚,低耦合".高内聚就是类的内部数据操作细节自己完成.不允许外部干涉:低耦合:仅暴漏少量的方法给外部使用. 封装(数据的隐藏) ...
- java 面对对象(抽象 继承 接口 多态)
什么是继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接 ...
- python 面向对象及封装继承和多态
######装饰器######装饰器的概念 - 装饰器的实现是函数里面嵌套函数;- 装饰器的本质是一个函数, 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能;- 装饰器需要传递一个函数, ...
- 初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)
JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM, ...
随机推荐
- Python基础(九) 常用模块汇总
3.8 json模块重点 json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去. 不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串.(比如Python的一个列 ...
- HDU 4055:Number String(DP计数)
http://acm.hdu.edu.cn/showproblem.php?pid=4055 题意:给一个仅包含‘I','D','?'的字符串,’I'表示前面的数字比后面的数字要小(Increase升 ...
- scrapy基础知识之 Scrapy 和 scrapy-redis的区别:
Scrapy 和 scrapy-redis的区别 Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础 ...
- 如何编写无须人工干预的shell脚本
在使用基本的一些shell命令时,机器需要与人进行互动来确定命令的执行.比如 cp test.txt boo/test.txt,会询问是否覆盖?ssh远程登陆时,需要输入人工密码后,才可以继续执行ss ...
- 20131214-EditPlus快捷键-第二十一天
EditPlus 快捷键 文件 FileFtpUpload Ctrl+Shift+S 上传文件到 FTP 服务器 FileNew Ctrl+N 新建普通的文本文档 FileNewHtml Ctrl ...
- MyBatis从入门到精通(十三):使用discriminator鉴别器映射
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解鉴别器映射discri ...
- 转载《Flex 布局》
网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂 ...
- Excel催化剂开源第14波-VSTO开发之单元格区域转DataTable
在Excel开发过程中,大部分时候是和Range单元格区域打交道,在VBA开发中,大家都知道的一点是,不能动不动就去遍历所有单元格,那性能是非常糟糕的,很多时候,是需要把整个单元格区域装入数组中再作处 ...
- NPM介绍
惠善一的博客:https://huishanyi.club NPM(Node Package Manger),Node包管理工具.在安装完Node之后,NPM便已经同时安装完成,用户可以通过NPM将自 ...
- 使用nginx+tomcat实现动静分离
动态资源与静态资源的区别 微微的概括一下 静态资源: 当用户多次访问这个资源,资源的源代码永远不会改变的资源. 动态资源:当用户多次访问这个资源,资源的源代码可能会发送改变. 什么是动静分离 动静分离 ...