当前位置: 首页 > news >正文

Go语言入门(17)-接口

接口关注于类型可以做什么,而不是存储了什么。

接口通过列举类型必须满足的一组方法来进行声明。在Go语言中,不需要显式声明接口。

任何类型的任何值,只要满足接口的要求,即定义了一个talk()方法,返回值为string

package mainimport ("fmt""strings"
)var t interface { //接口专用关键字:interfacetalk() string //talk方法,返回值string
}type martian struct{}func (m martian) talk() string {return "nake nake"
}type laser intfunc (l laser) talk() string {return strings.Repeat("pew", int(l))
}func main() {t = martian{}fmt.Println(t.talk())t = laser(3)fmt.Println(t.talk())}

接口类型:

为了复用,通常会把接口声明为类型(按约定,接口名称通常以er结尾)。

package mainimport ("fmt""strings"
)type talker interface {talk() string
}type martian struct{}func (m martian) talk() string {return "nack nack"
}type laser intfunc (l laser) talk() string {return strings.Repeat("pew",int(l))
}func shout(t talker) {louder := strings.ToUpper(t.talk())fmt.Println(louder)
}func main(){shout(martian{})shout(laser(2))
}

同时,Go的接口都是隐式满足的,例子如下,它的目的是:定义一个接口stardater,要求实现者提供“年内日”(YearDay)和“小时”(Hour)方法。然后,通过stardate函数计算一个自定义的“星际日期”值:1000 + 年内日 + (小时 / 24)

package mainimport ("fmt""time"
)type stardater interface {YearDay() intHour() int
}type sol intfunc (s sol) YearDay() int {return int(s % 668)
}func (s sol) Hour() int {return 0
}func stardate(t stardater) float64 {doy := float64(t.YearDay())h := float64(t.Hour()) / 24.0return 1000 + doy + h
}func main() {day := time.Date(2012,8,6,5,17,0,0,time.UTC)fmt.Printf("%.1f Curiosity has landed\n",stardate(day))s := sol(1422)fmt.Printf("%.1f Happy birthday\n",stardate(s))
}

上述例程展示了Go的接口如何让不同类型(如内置的time.Time和自定义的sol)无缝协作,而无需显式继承。

满足接口:

Go标准库导出了很多只有单个方法的接口,Go通过简单的、通常只有单个方法的的接口,来鼓励组合而不是继承,这些接口在各个组件之间形成了简明易懂的界限。

例如fmt包声明的Stringer接口

package mainimport "fmt"type location struct {lat,long float64
}func (l location) string() string {return fmt.Sprintf("%v,%v",l.lat,l.long)
}func main() {curiosity := location{-4.5674,137.4417}fmt.Println(curiosity)
}

http://www.dtcms.com/a/438261.html

相关文章:

  • WebPages 安全
  • 安卓基础组件030-进程和线程
  • [ vue 前端框架 ] 基本用法和vue.cli脚手架搭建
  • 鸿蒙Next中使用Socket进行网络通信:完整指南与实战
  • dw如何做商业网站淘宝网站建设流程
  • 网站做好了 怎么做解析wordpress 怎么迁移
  • GNS3 3.0.5新版教程,以及Cloud设备找不到VMware网卡的解决方法
  • 比奇堡合唱团制作教学,AI翻唱教学动漫角色歌曲
  • 活动展板设计:大尺寸 + 高分辨率,打印清晰
  • 深圳市城乡建设部网站首页一个网站如何做盈利
  • 【IMX6ULL驱动学习】I2C驱动
  • 基于物联网数据采集的大型应用程序软件架构设计:核心要点、结构内容与链路关系
  • 【连载5】云数据库 MySQL 热点更新功能介绍
  • (四)Webpack、Slot与Vue CLI脚手架
  • 【附源码】个人事务管理系统的设计与实现
  • 基于PCIe(XDMA)的多路(1-32路)信号采集与回放子系统,多路视频、AD、光纤等信号,支持PR over PCIe
  • 【STM32项目开源】基于STM32的智能电子秤
  • 网站建设专用图形库西安网站快速排名提升
  • 红色php企业网站模板下载wordpress slider设置
  • Starting again-02
  • 【IMX6ULL驱动学习】PWM驱动
  • 智能向善” 核心,解析技术发展中的红利与风险平衡
  • 品牌 RWA 化构建白皮书
  • 个人数据泄露有哪些法律与安全风险?
  • 学习Java第二十九天——黑马点评33~36
  • 常见端口安全弱点汇总表
  • 抓取网站访问量小程序登录网址
  • LNMP 环境部署 WordPress
  • 从域名到网站建设完成的流程连云港做网站哪家好
  • 企业后端多节点部署实现大文件分片与断点上传