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语言学习之路六:接口详解的更多相关文章

  1. SpringMVC学习总结(三)——Controller接口详解(2)

    4.5.ServletForwardingController 将接收到的请求转发到一个命名的servlet,具体示例如下: package cn.javass.chapter4.web.servle ...

  2. SpringMVC学习总结(三)——Controller接口详解(1)

    4.12.ParameterizableViewController 参数化视图控制器,不进行功能处理(即静态视图),根据参数的逻辑视图名直接选择需要展示的视图. <bean name=&quo ...

  3. 【原创】go语言学习(五)函数详解1

    目录 1.函数介绍 2.多返回值和可变参数 3.defer语句 4.内置函数介绍 1.函数介绍 1.1定义: 有输⼊入.有输出,⽤用来执⾏行行⼀一个指定任务的代码块. func functionnam ...

  4. Go语言学习之路

    我关于Go语言的博客原本发布于我的个人网站:wwww.liwenzhouu.com.但是被某些人抄怕了,没办法只好搬运到博客园. 我的Go语言学习之路 2015年底我因为工作原因接触到了Go语言,那时 ...

  5. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

  6. 12天学好C语言——记录我的C语言学习之路(Day 11)

    12天学好C语言--记录我的C语言学习之路 Day 11: 因为指针部分比较的难,所以我们花费的时间也是最长的,希望大家耐的住性子,多多理解,多多打代码.好了,废话不多说,来看第11天的学习. //编 ...

  7. 12天学好C语言——记录我的C语言学习之路(Day 10)

    12天学好C语言--记录我的C语言学习之路 Day 10: 接着昨天的指针部分学习,有这么一个题目: //还是四个学生,四门成绩,只要有学生一门功课没及格就输出这个学生的所有成绩 /*//progra ...

  8. 12天学好C语言——记录我的C语言学习之路(Day 9)

    12天学好C语言--记录我的C语言学习之路 Day 9: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...

  9. 12天学好C语言——记录我的C语言学习之路(Day 8)

    12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...

随机推荐

  1. datagrid的基本属性&查询和清空功能的实现

    1.datagrid基本属性 <script charset=UTF-8"> $(function(){ $("#datagrid").datagrid({ ...

  2. luoguT30204 偷上网

    \(n=1\) 时特判四角,其余时刻圆的面积和必小于正方形面积,随机点出来判断就行了. stm 随机算法-- #include <iostream> #include <cstdli ...

  3. 移动Web应用程序开发HTML5篇

    https://software.intel.com/zh-cn/blogs/2012/03/09/webhtml5-offline-web-applications

  4. 设计模式之第12章-享元模式(Java实现)

    设计模式之第12章-享元模式(Java实现) “怎么回事,竟然出现了OutOfMemory的错误.鱼哥,来帮我看看啊.”“有跟踪错误原因么?是内存泄露么?”“不是内存泄露啊,具体原因不知道啊.对了,有 ...

  5. c#中dynamic ExpandoObject的用法

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. Gym100623A Access Control Lists

    Gym 100623A Access Control Lists 这个题很sb啊,就是去设置个交换机 我们可以给一个IP进行设置,也可以对一个网段就行设置,但是IP是优于网段的,比如样例的第一个 网段 ...

  7. 我的第一个python程序——猜数字

    #Author:xiaoxiao age = 22 #标准正确答案 counter = 0 #计数器 for i in range(10): #循环10次 if counter < 3: gue ...

  8. MySql数据库 - 2.启动与关闭

    MySql服务的启动: 右键计算机 - 管理 - 服务和应用程序 - 服务 - 右键 MySQL80 可以启动/停止MySQL(也可以点击属性 改变启动类型:手动/自动). 自动启动状态下,每次打开计 ...

  9. 【bzoj2529】[Poi2011]Sticks 贪心

    题目描述 给出若干木棍,每根木棍有特定的颜色和长度.问能否找到三条颜色不同的木棍构成一个三角形.(注意这里所说的三角形面积要严格大于0) 输入 第一行给出一个整数k(3<=k<=50),表 ...

  10. hihoCoder #1661 数组区间

    题目大意 给出 $1$ 到 $n$ 的一个排列($n\le 10^5$),记做 $a_1, a_2, \dots, a_n$ .(注:原题面表述为:"给定 $n$ 个互不相同且不超过 $n$ ...