go语言学习之路六:接口详解
Go语言没有类和继承的概念,但是接口的存在使得它可以实现很多面向对象的特性。接口定义了一些方法,但是这些方法不包含实现的代码。也就是说这些代码没有被实现(抽象的方法)。同时接口里面也不包含变量。
看一个简单的接口定义:
type inf interface {
Method1(param)
Method2(param)
}
在go语言中接口一般包含0-3个方法。类型(如结构体)实现了接口中的方法,就是实现了接口,实现了接口类型的结构体变量可以赋值给接口类型的变量,直接看一个例子帮助理解:
package main
import (
"fmt"
)
type stockPosition struct {
ticker string
sharePrice float32
count float32
}
func (s stockPosition) getValue() float32 {
return s.sharePrice * s.count
}
type valueable interface {
getValue() float32
}
func showValue(asset valueable) {
fmt.Printf("value of the asset is %f\n", asset.getValue())
}
func main() {
var o valueable
o = stockPosition{"GOOG", 577.20, 4}
showValue(o)
}
Output:value of the asset is 2308.800049
主函数中声明了一个valueable的接口o,然后将实现了这个接口的结构体赋值给了o。Golang的接口不需要显示的声明,好处有:
1.在接口实现过程中只要关心自己要提供哪些方法就行,不用纠结其他。
2.不用担心其他模块定义过类似的接口,只要关心自己有什么需求,然后按照需求去定义就行。
继续看。我们稍微加点料,代码添加几行如下:
package main
import (
"fmt"
)
type stockPosition struct {
ticker string
sharePrice float32
count float32
}
func (s stockPosition) getValue() float32 {
return s.sharePrice * s.count
}
type f float32
func (s f) getValue() float32 {
return 0.1
}
type valueable interface {
getValue() float32
}
func showValue(asset valueable) {
fmt.Printf("value of the asset is %f\n", asset.getValue())
}
func main() {
var o valueable
o = stockPosition{"GOOG", 577.20, 4}
showValue(o)
var t f
o = t
showValue(o)
}
Output:
value of the asset is 2308.800049
value of the asset is 0.100000
我们定义了一个f,然后实现了getValue方法,其赋值给o,再调用valueable类型的接口才可以调用的showValue打印值。也就是说所有实现了valueable接口的类型都可以调用这个函数。
总结下,golang不支持面向对象的编程思想(没有类,没有继承),而要实现多态就完全需要接口了。接口就是一组方法的集合,它对外隐藏了方法的实现。只要一个类型A实现了接口中的方法,这个接口的变量o就可以接受类型A的变量,其他的变量也实现了的话,也o也可以接受其他变量。(如有错误之处,欢迎批评指出~)
go语言学习之路六:接口详解的更多相关文章
- SpringMVC学习总结(三)——Controller接口详解(2)
4.5.ServletForwardingController 将接收到的请求转发到一个命名的servlet,具体示例如下: package cn.javass.chapter4.web.servle ...
- SpringMVC学习总结(三)——Controller接口详解(1)
4.12.ParameterizableViewController 参数化视图控制器,不进行功能处理(即静态视图),根据参数的逻辑视图名直接选择需要展示的视图. <bean name=&quo ...
- 【原创】go语言学习(五)函数详解1
目录 1.函数介绍 2.多返回值和可变参数 3.defer语句 4.内置函数介绍 1.函数介绍 1.1定义: 有输⼊入.有输出,⽤用来执⾏行行⼀一个指定任务的代码块. func functionnam ...
- Go语言学习之路
我关于Go语言的博客原本发布于我的个人网站:wwww.liwenzhouu.com.但是被某些人抄怕了,没办法只好搬运到博客园. 我的Go语言学习之路 2015年底我因为工作原因接触到了Go语言,那时 ...
- 12天学好C语言——记录我的C语言学习之路(Day 12)
12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...
- 12天学好C语言——记录我的C语言学习之路(Day 11)
12天学好C语言--记录我的C语言学习之路 Day 11: 因为指针部分比较的难,所以我们花费的时间也是最长的,希望大家耐的住性子,多多理解,多多打代码.好了,废话不多说,来看第11天的学习. //编 ...
- 12天学好C语言——记录我的C语言学习之路(Day 10)
12天学好C语言--记录我的C语言学习之路 Day 10: 接着昨天的指针部分学习,有这么一个题目: //还是四个学生,四门成绩,只要有学生一门功课没及格就输出这个学生的所有成绩 /*//progra ...
- 12天学好C语言——记录我的C语言学习之路(Day 9)
12天学好C语言--记录我的C语言学习之路 Day 9: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...
- 12天学好C语言——记录我的C语言学习之路(Day 8)
12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...
随机推荐
- Nodejs-文件流
1.什么是流? 流是程序输入输出的一个连续的字节序列. 有文件流,网络流,设备(例如鼠标,键盘,磁盘,调制解调器和打印机)的输入输出都是用流来处理的. 任何数据的最根本表现形式都是二进制. 读取文件 ...
- windows下,cmd 运行 python 脚本,选中文字就停止运行了【已解决】
参考资料: https://jingyan.baidu.com/article/ce09321bb95dda2bff858f26.html 问题原因: cmd 里面,快速编辑模式会暂停程序 解决步骤: ...
- 使用html进行浏览器判断,浏览器条件注释
下面来点今天写东西的时候查资料,收集的关于使用html进行浏览器判断的一些资料: 条件注释的基本格式: <!--[if expression]>注释内容<![endif]--> ...
- 【N-Quens II】cpp
题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...
- 【Luogu P2781】 传教
这题是可以用线段树做的. 虽然$n\leq 10^9$ 可以发现,真正需要用到的节点很少,故动态开点,只有需要用到的时候才新建节点. 这里我在下放标记的时候新建节点,因为每操作/查询一个节点都需要先下 ...
- sql语句查询数据库案例
package com.hanqi.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...
- Monkey日志信息的11种Event percentages
我们查看官方文档,表里只给出了8种事件(可以看我上篇的翻译文档).但我们运行Monkey后,却发现有11种事件!最坑爹的是,在每种事件的百分比后面,他还不给注明是什么事件! 原来不同的Android ...
- jmter+ANT+jekins之配置文件简单优化(build.xml)
<?xml version="1.0" encoding="utf-8"?> <project name="ant-jmeter-t ...
- 第一章:前端布局之display属性
css布局学习网站:http://zh.learnlayout.com
- VMware Fusion Pro安装Ubuntu 18.04.1