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)的使用方法相关推荐

  1. Go 学习笔记(35)— Go 接口 interface (接口声明、接口初始化、接口方法调用、接口运算、类型断言、类型查询、空接口)

    1. 接口概念 接口是双方约定的一种合作协议.接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节.接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式.类型及结构. 接口内部存 ...

  2. java interface 默认_Java8 接口interface默认方法

    在 java 8 之前,接口与其实现类之间的 耦合度 太高了(tightly coupled),当需要为一个接口添加方法时,所有的实现类都必须随之修改.默认方法解决了这个问题,它可以为接口添加新的方法 ...

  3. 零基础入门 自学 JAVA SE 基础篇(九)instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface)

    JAVA SE自学 基础篇 多态 instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface) 目标 父类型与子类型之间的转换及instanceo ...

  4. Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)

    1. 接口的定义 接口是和调用方的一种约定,它是一个高度抽象的类型,不用和具体的实现细节绑定在一起.接口要做的是定义好约定,告诉调用方自己可以做什么,但不用知道它的内部实现,这和我们见到的具体的类型如 ...

  5. php中的抽象类(abstract class)和接口(interface)

    一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...

  6. Mybatis接口Mapper内的方法为啥不能重载?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://my.oschina.net/zud ...

  7. 支付宝二面:Mybatis接口Mapper内的方法为啥不能重载吗?我直接懵逼了...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:祖大俊来源:my.oschina.net/zudajun/b ...

  8. 接口(Interface)的深入理解

    接口(Interface)的深入理解 一:接口是规范(不展开) 二:接口可以看成是一个特殊的类 1: 接口可以定义"接口类型变量",就好像类可以定义类类型的变量(或者说是引用类型变 ...

  9. Java接口interface

    Java接口interface 1.多个无关的类可以实现同一个接口. 2.一个类可以实现多个无关的接口. 3.与继承关系类似,接口与实现类之间存在多态性. 接口(interface)是抽象方法和常量值 ...

最新文章

  1. initWithCoder: 与initWithFrame:
  2. openstack 重启mysql_突然断电导致mariadb数据库无法启动(openstack 命令无法使用)...
  3. pmp每日三题(2022年3月15日)
  4. 手机游戏资源 特效 显存分析工具
  5. javascript基础知识-数组
  6. 2022秋招求职记录(图像 视觉 c++)
  7. 初二生态系统思维导图_有关初中生态系统的思维导图
  8. webservice接口对接
  9. python合并excel工作簿_ExcelPython合并处理Excel工作簿、工作表
  10. android写日记app,写日记的app哪个好用 写日记的软件有哪些
  11. ajax读取txt出现乱码问题,ajax读取txt文本时乱码的解决方案
  12. 云上架构和传统IT架构有什么区别及优势?
  13. wifipumpkin3启动报No such file or directory: b‘liblibc.a‘
  14. 企业微信会议室管理,对接企业微信官方应用会议室,会议管理系统功能清单
  15. linux 深入理解I2C内核驱动
  16. 关于亚马逊开店需要做哪些准备
  17. 网络安全状况月度报告-2019年6月
  18. 游戏编程入门(5):使用键盘和鼠标控制游戏
  19. 统一自己的mac和linux环境的终端使用(alacritty+tmux代替iterm2)
  20. 对象与对象变量 LJY第二周

热门文章

  1. php -- 魔术方法 之 自动加载:__autoload()
  2. Effective C++条款7:为多态基类声明virtual析构函数
  3. HDU-1172 猜数字 广搜
  4. 程序员听爵士,架构师学做交响指挥
  5. Java 开发常用资源
  6. 轻量级的移动开发JavaScript框架-zepto.js
  7. linux svn官网,linux svn
  8. 使用labelme进行图片语义分割数据的标注(如何转换为训练的灰度图,即像素值为类别值)
  9. jeecms 代码生成 Tools
  10. 三十六.MHA集群概述 、 部署MHA集群 测试配置