文档章节

Go接口——基本概念

秋风醉了
 秋风醉了
发布于 2016/07/11 15:18
字数 809
阅读 39
收藏 0

Go接口——基本概念

Interfaces are named collections of method signatures.

当你有看到一个接口类型时,你不知道它是什么,唯一知道的就是可以通过它的方法来做什么。

C++,Java 使用“侵入式”接口,主要表现在实现类需要明确声明自己实现了某个接口。这种强制性的接口继承方式是面向对象编程思想发展过程中一个遭受相当多质疑的特性。

**Go语言采用的是“非侵入式接口”,Go语言的接口有其独到之处:只要类型 T 的公开方法完全满足接口 I 的要求,就可以把类型 T 的对象用在需要接口 I 的地方,所谓类型 T 的公开方法完全满足接口 I 的要求,也即是类型 T 实现了接口 I 所规定的一组成员。**这种做法的学名叫做Structural Typing,有人也把它看作是一种静态的Duck Typing。

下面我们通过一组例子来演示如何定义一个接口,如何实现接口。

package main

import (
	"fmt"
	"math"
)

// 首字母小写,该函数不是导出的,就是说在包外不能调用
// 函数参数为 Geometry 接口类型
func measure(g Geometry) {
	fmt.Println(g)
	fmt.Println(g.Area())
	fmt.Println(g.Perim())
}
func main() {
	r := Rect{Width: 3, Height: 4}
	c := Circle{Radius: 5}

	fmt.Printf("%T\n", r) //main.Rect
	fmt.Printf("%T\n", c) //main.Circle

	// r,c 所对应的类型实现了接口的所有方法,所以也是接口类型的变量
	measure(r) //可以调用
	measure(c)
}

// 使用type ... interface 定义接口
// 一般地,Go中接口的命名约定:接口名以er结尾。注意,这里并非强行要求,你完全可以不以 er 结尾。标准库中有些接口也不是以 er 结尾的。
type Geometry interface {
	Area() float64
	Perim() float64
}

type Rect struct {
	Width, Height float64 // 结构体 Rect 的成员变量,开头首字母大写,都是导出的
}

type Circle struct {
	Radius float64
}

// To implement an interface in Go, we just need to implement all the methods in the interface. Here we implement Geometry on Rect.
// 在go中,实现一个接口,只需要实现接口中定义的所有方法,而不需要指明所实现的接口。

func (r Rect) Area() float64 {
	return r.Width * r.Height
}
func (r Rect) Perim() float64 {
	return 2*r.Width + 2*r.Height
}

// end===== Geometry接口的 Rect 实现

func (c Circle) Area() float64 {
	return math.Pi * c.Radius * c.Radius
}
func (c Circle) Perim() float64 {
	return 2 * math.Pi * c.Radius
}

// end===== Geometry接口的 Circle 实现

这就是接口的基本概念和使用方法。我们再来看一下例子。

package main

import (
	"fmt"
)

// 定义 Phone 接口
// 只有一个方法声明
type Phone interface {
	sales() int
}

type NokiaPhone struct {
	price int
}

// 实现接口的方法,也就表示 NokiaPhone 是 Phone 接口的一个实现
func (nokiaPhone NokiaPhone) sales() int {
	return nokiaPhone.price
}

type IPhone struct {
	price int
}

// 实现接口的方法,也就表示 IPhone 是 Phone 接口的一个实现
func (iPhone IPhone) sales() int {
	return iPhone.price
}

type Person struct {
	phones []Phone //接口作为结构体数据成员
	name   string
	age    int
}

func (person Person) total_cost() int {
	var sum = 0
	for _, phone := range person.phones {
		sum += phone.sales()
	}
	return sum
}

func main() {
	var bought_phones = [5]Phone{
		NokiaPhone{price: 350},
		IPhone{price: 5000},
		IPhone{price: 3400},
		NokiaPhone{price: 450},
		IPhone{price: 5000},
	}

	var person = Person{name: "Jemy", age: 25, phones: bought_phones[:]}

	fmt.Println(person.name)
	fmt.Println(person.age)
	fmt.Println(person.total_cost())
}

参考:

https://gobyexample.com/interfaces

http://golanghome.com/post/11

========END========

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 236
博文 577
码字总数 418437
作品 0
朝阳
程序员
第一章节:Revit API基本概念

本章我们只要记录下载我本人学习Revit二次开发过程的API基本概念 1.外部命令:IExternalCommand 2.外部应用:IExternalApplication 3.插件的属性(Transaction、Journaling) 4.Revit的应用类...

sinat_38321889
2017/11/21
0
0
Java中的接口Interface是不是继承自Object?+ 复习基本概念

概要 今天遇见一个严肃的问题,说出大家看看, Java中的接口Interface是不是继承自Object? 下面一起来看看吧! interface是继承自Object? 开门见山得回答——不是 引用自 《The Java Langua...

xidiancoder
2017/09/17
0
0
Tensorflow基础

刚开始接触tensorflow,分享一些实用基础的Tensorflow基础教程链接: Tensorflow一些常用基本概念与函数(一) Tensorflow一些常用基本概念与函数(二) Tensorflow一些常用基本概念与函数(...

zhaokx3
2017/04/05
0
0
无痛的机器学习第二季目录

以下是对这一年来完成的文章的汇总贴,陆续还会有新的内容加入,尽情期待! 无痛的机器学习第一季目录传送门:无痛的机器学习第一季目录 增强学习 增强学习入门1——基本概念 增强学习入门2...

冯超
2017/11/22
0
0
【特色】Hello,未来网络 –SDN实战特训营(第X期)

SDN实战特训营是未来网络学院的特色培训项目,目前已在各一线城市开展了八期。该项目以实战为牵引,结合OpenDaylight和OpenStack两大主流开源项目,帮助学员快速全面的掌握SDN编程方法和思路...

m2l0zgssvc7r69efdtj
2017/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SQL count(*) 和count(1)的区别

开发中经常会使用这两个聚合函数,作用都是用来统计记录行,今天查找资料发现,其实这两个函数并没有区别, 实践才是检验的标准,首先看执行计划(表是我自己建立的): 可以看到,两个执行计...

一曲图森破
19分钟前
1
0
ppwjs之bootstrap文字排版:字体设置

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
22分钟前
1
0
区块链100讲:详解区块链之P2P网络

1 P2P网络 如果我们简单来看 P2P 技术,它的应用领域已经非常广泛了,从流媒体到点对点通讯、从文件共享到协同处理,多种领域都有它的身影出现。 同样的,P2P 的网络协议也有很多,比较常见的...

HiBlock
37分钟前
0
0
74.expect脚本同步文件以及指定host同步文件 构建分发系统文件和命令

20.31 expect脚本同步文件: 在expect脚本中去实现在一台机器上把文件同步到另外一台机器上去。核心命令用的是rsync ~1.自动同步文件 #!/usr/bin/expect set passwd "123456" spawn rsync -a...

王鑫linux
今天
1
0
TypeScript项目引用(project references)

转发 TypeScript项目引用(project references) TypeScript新特性之项目引用(project references) 项目引用是TypeScript 3.0中的一项新功能,允许您将TypeScript程序构建为更小的部分。 通过这...

durban
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部