文档章节

Go接口——基本概念

秋风醉了
 秋风醉了
发布于 2016/07/11 15:18
字数 809
阅读 38
收藏 0
点赞 0
评论 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========

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 223
博文 581
码字总数 411013
作品 0
东城
程序员
第一章节:Revit API基本概念

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

sinat_38321889 ⋅ 2017/11/21 ⋅ 0

J2EE规范系列之 JMS1.1 (一) 基本概念

什么是JMS JMS(Java Message Service) 即Java消息服务。它提供标准的产生、发送、接收消息的接口简化企业应用的开发。它是J2EE规范的一部分,定义的接口标准,针对不同的厂商有不同的实现库。...

Garrry ⋅ 2015/07/06 ⋅ 0

Java中的接口Interface是不是继承自Object?+ 复习基本概念

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

xidiancoder ⋅ 2017/09/17 ⋅ 0

无痛的机器学习第二季目录

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

冯超 ⋅ 2017/11/22 ⋅ 0

Tensorflow基础

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

zhaokx3 ⋅ 2017/04/05 ⋅ 0

【特色】Hello,未来网络 –SDN实战特训营(第X期)

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

m2l0zgssvc7r69efdtj ⋅ 2017/11/29 ⋅ 0

新书预告 :《Struts2技术内幕》 —— Struts2源码研究和Web开发研究

http://www.iteye.com/topic/1117044 简单做一个新书预告,我写的《Struts2技术内幕》将在下个月问世。 这本书应该是国内比较少见的以研究Struts2的源码为主要目标的技术书籍。源码研究类的书...

ddatsh ⋅ 2011/10/26 ⋅ 8

【数据平台】python语言NLP库Gensim初识

1、基本介绍 Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法...

fjssharpsword ⋅ 2017/11/01 ⋅ 0

WebCollector 2.x教程列表

WebCollector爬虫官网:https://github.com/CrawlScript/WebCollector WebCollector 2.x教程列表 WebCollector教程——在Eclipse项目中配置使用WebCollector爬虫 JAVA爬虫WebCollector 2.x入......

MiniBu ⋅ 2016/08/26 ⋅ 0

java8 lambda表达式与集合类批处理操作

一、基本概念 λ表达式可以被当做是一个Object。λ表达式的类型,叫做“目标类型(target type)”。λ表达式的目标类型是“函数接口(functional interface)”,这是Java8新引入的概念。它...

cloud-coder ⋅ 2014/03/31 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 19分钟前 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 46分钟前 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 54分钟前 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

容器之查看minikue的environment——minikube的环境信息

执行如下命令 mjduan@mjduandeMacBook-Pro:~/Docker % minikube docker-envexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.99.100:2376"export DOCKER_CERT_PATH="/U......

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部