Go接口(Interface)的使用方法
Go 语言不是一种 “传统” 的面向对象编程语言:它里面没有类和继承的概念。这是多态的Go版本.
demo_1.go在 main()方法中创建了一个 Square 的实例。在主程序外边定义了一个接收者类型是 Square 方法的 Area() ,用来计算正方形的面积:结构体 Square 实现了接口 Shaper 。所以可以将一个 Square 类型的变量赋值给一个接口类型的变量: areaIntf = sq1 。现在接口变量包含一个指向 Square 变量的引用,通过它可以调用 Square 上的方法 Area() 。当然也可以直接在Square 的实例上调用此方法,但是在接口实例上调用此方法更令人兴奋,它使此方法更具有一般性。接口变量里包含了接收者实例的值和指向对应方法表的指针。这是 多态 的 Go 版本,多态是面向对象编程中一个广为人知的概念:根据当前的类型选择正确的方法,或者说:同一种类型在不同的实例上似乎表现出不同的行为。1.demo_1.go
package main
import "fmt"type Shaper interface {//定义接口Area() float32
}type Square struct {//结构体side float32
}func (sq *Square) Area() float32 {//接口方法return sq.side * sq.side
}func main() {sq1 := new(Square)//new一个结构体对象sq1.side = 5var areaIntf Shaper//接口//areaIntf = sq1 //方式一areaIntf = Shaper(sq1) //方式二fmt.Printf("The square has area: %f\n", areaIntf.Area())
}2.demo_2.go
package main
import "fmt"type Shaper interface {//接口定义Area() float32}type Square struct {//正方形结构体side float32}
func (sq *Square) Area() float32 {//正方形接口实现return sq.side * sq.side}type Rectangle struct {//矩形结构体length, width float32}
func (r Rectangle) Area() float32 {//矩形接口实现return r.length * r.width}
//add by begin
type Test struct{x,y float32}
func (m Test) Area() float32{return m.x + m.y}
//add endfunc main() {r := Rectangle{5, 3} // Area() of Rectangle needs a valueq := &Square{5} // Area() of Square needs a pointer//add byo := Test{4,7}shapes := []Shaper{r, q,o}fmt.Println("Looping through shapes for area ...")for n := range shapes {fmt.Println("n======> ", n)fmt.Println("Shape details: ", shapes[n])fmt.Println("Area of this shape is: ", shapes[n].Area())}
}3.demo_3.go
package main
import "fmt"
type stockPosition struct {ticker stringsharePrice float32count float32
}func (s stockPosition) getValue() float32 {return s.sharePrice * s.count
}type car struct {make stringmodel stringprice float32
}func (c car) getValue() float32 {return c.price
}type valuable interface {getValue() float32
}func showValue(asset valuable) {fmt.Printf("Value of the asset is %f\n", asset.getValue())
}func main() {var o valuable = stockPosition{"GOOG", 577.20, 4}showValue(o)o = car{"BMW", "M3", 66500}showValue(o)
}
Go接口(Interface)的使用方法相关推荐
- Go 学习笔记(35)— Go 接口 interface (接口声明、接口初始化、接口方法调用、接口运算、类型断言、类型查询、空接口)
1. 接口概念 接口是双方约定的一种合作协议.接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节.接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式.类型及结构. 接口内部存 ...
- java interface 默认_Java8 接口interface默认方法
在 java 8 之前,接口与其实现类之间的 耦合度 太高了(tightly coupled),当需要为一个接口添加方法时,所有的实现类都必须随之修改.默认方法解决了这个问题,它可以为接口添加新的方法 ...
- 零基础入门 自学 JAVA SE 基础篇(九)instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface)
JAVA SE自学 基础篇 多态 instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface) 目标 父类型与子类型之间的转换及instanceo ...
- Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)
1. 接口的定义 接口是和调用方的一种约定,它是一个高度抽象的类型,不用和具体的实现细节绑定在一起.接口要做的是定义好约定,告诉调用方自己可以做什么,但不用知道它的内部实现,这和我们见到的具体的类型如 ...
- php中的抽象类(abstract class)和接口(interface)
一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...
- Mybatis接口Mapper内的方法为啥不能重载?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://my.oschina.net/zud ...
- 支付宝二面:Mybatis接口Mapper内的方法为啥不能重载吗?我直接懵逼了...
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:祖大俊来源:my.oschina.net/zudajun/b ...
- 接口(Interface)的深入理解
接口(Interface)的深入理解 一:接口是规范(不展开) 二:接口可以看成是一个特殊的类 1: 接口可以定义"接口类型变量",就好像类可以定义类类型的变量(或者说是引用类型变 ...
- Java接口interface
Java接口interface 1.多个无关的类可以实现同一个接口. 2.一个类可以实现多个无关的接口. 3.与继承关系类似,接口与实现类之间存在多态性. 接口(interface)是抽象方法和常量值 ...
最新文章
- initWithCoder: 与initWithFrame:
- openstack 重启mysql_突然断电导致mariadb数据库无法启动(openstack 命令无法使用)...
- pmp每日三题(2022年3月15日)
- 手机游戏资源 特效 显存分析工具
- javascript基础知识-数组
- 2022秋招求职记录(图像 视觉 c++)
- 初二生态系统思维导图_有关初中生态系统的思维导图
- webservice接口对接
- python合并excel工作簿_ExcelPython合并处理Excel工作簿、工作表
- android写日记app,写日记的app哪个好用 写日记的软件有哪些
- ajax读取txt出现乱码问题,ajax读取txt文本时乱码的解决方案
- 云上架构和传统IT架构有什么区别及优势?
- wifipumpkin3启动报No such file or directory: b‘liblibc.a‘
- 企业微信会议室管理,对接企业微信官方应用会议室,会议管理系统功能清单
- linux 深入理解I2C内核驱动
- 关于亚马逊开店需要做哪些准备
- 网络安全状况月度报告-2019年6月
- 游戏编程入门(5):使用键盘和鼠标控制游戏
- 统一自己的mac和linux环境的终端使用(alacritty+tmux代替iterm2)
- 对象与对象变量 LJY第二周
热门文章
- php -- 魔术方法 之 自动加载:__autoload()
- Effective C++条款7:为多态基类声明virtual析构函数
- HDU-1172 猜数字 广搜
- 程序员听爵士,架构师学做交响指挥
- Java 开发常用资源
- 轻量级的移动开发JavaScript框架-zepto.js
- linux svn官网,linux svn
- 使用labelme进行图片语义分割数据的标注(如何转换为训练的灰度图,即像素值为类别值)
- jeecms 代码生成 Tools
- 三十六.MHA集群概述 、 部署MHA集群 测试配置