Interface定义:

type Namer interface {
Method1(param_list) return_type
Method2(param_list) return_type
...
}

注:

1. interface中不能包含变量

2. 一个类型不用显式去定义实现某个接口,只要包含所有interface中定义的方法,这个类型就默认实现了这个接口

3. 多个类型可以实现相同的接口

4. 一个类型实现接口的同时,还可以定义属于自己的方法

5. 一个类型可以实现多个接口

嵌套的interface

type ReadWrite interface {
Read(b Buffer) bool
Write(b Buffer) bool
} type Lock interface {
Lock()
Unlock()
} type File interface {
ReadWrite
Lock
Close()
}

这样File会包含ReadWrite和Lock中所有的方法

判断interface类型

v := varI.(T)
//varI must be an interface variable.

实例

package lemon

type Shaper interface {
Area() float32
}
type Square struct {
Side float32
} func (sq *Square) Area() float32 {
return sq.Side * sq.Side
} //use in main func.
func showInterfaceUsage() {
sq1 := new(lemon.Square)
sq1.Side =
var areaIntf lemon.Shaper
areaIntf = sq1 if v, ok := areaIntf.(*lemon.Square); ok {
fmt.Printf("The square has area: %f\n", v.Area())
}
}

注意:方法的定义中传的type为指针,判断时也要传指针。

    switch areaIntf.(type) {
case *lemon.Square:
fmt.Printf("The square area is %f\n", areaIntf.Area())
default:
fmt.Printf("The default type")
}

也可以直接通过方法interface.(type)来获得接口的类型

判断类型是否实现了接口

...待续

[Go语言]从Docker源码学习Go——Interfaces的更多相关文章

  1. [Go语言]从Docker源码学习Go——结构和函数的定义

    Docker在最近很火,而作为Docker的开发语言-Go也再次被大家提到. 已经使用Docker一段时间了,但是对于源码,尤其是其开发语言Go却一直是一知半解. 最近准备利用空余时间从Docker源 ...

  2. [Go语言]从Docker源码学习Go——指针和Structs

    这两天在看reflect这个包在Docker中的使用时,遇到了各种问题,最后虽然知道怎么用了. 但是对于这块的原理还不是太懂,于是把"THE WAY TO GO"中关键的几章看了下 ...

  3. [Go语言]从Docker源码学习Go——function和method

    function和method关系 method是针对某一类型定义的function, function可以单独调用,method必须针对某一类型的实例进行调用 //function 调用方式 pac ...

  4. [Go语言]从Docker源码学习Go——if语句和map结构

    if语句 继续看docker.go文件的main函数 if reexec.Init() { return } go语言的if不需要像其它语言那样必须加括号,而且,可以在判断以前,增加赋值语句 语法 I ...

  5. [Go语言]从Docker源码学习Go——init()方法和identifier首字母大小写区分

    init()方法 如果想在一个go文件里,进行一些初始化的工作,可以把代码放到init()方法中. init()方法先被执行. func init() { // initialization of p ...

  6. [Go语言]从Docker源码学习Go——main函数

    Go程序从main包下的main函数开始执行,当main执行结束后,程序退出. Docker的main函数在 docker/docker/docker.go package main //Import ...

  7. Go语言 context包源码学习

    你必须非常努力,才能看起来毫不费力! 微信搜索公众号[ 漫漫Coding路 ],一起From Zero To Hero ! 前言 日常 Go 开发中,Context 包是用的最多的一个了,几乎所有函数 ...

  8. Docker源码分析(三):Docker Daemon启动

    1 前言 Docker诞生以来,便引领了轻量级虚拟化容器领域的技术热潮.在这一潮流下,Google.IBM.Redhat等业界翘楚纷纷加入Docker阵营.虽然目前Docker仍然主要基于Linux平 ...

  9. Docker源码分析(二):Docker Client创建与命令执行

    1. 前言 如今,Docker作为业界领先的轻量级虚拟化容器管理引擎,给全球开发者提供了一种新颖.便捷的软件集成测试与部署之道.在团队开发软件时,Docker可以提供可复用的运行环境.灵活的资源配置. ...

随机推荐

  1. WPF 流文档

    WPF文本显示: WPF面向的是UI展现,而文本显示无疑是UI层中的重要功能之中的一个.WPF提供了XPS (XML 文件规范) 和Flow Document (流文档) 来在不同的场景下展现或者操作 ...

  2. Repository模式(转载)

    近来发现很多ASP.NET MVC的例子中都使用了Repository模式,比如Oxite,ScottGu最近发布的免费的ASP.NET MVC教程都使用了该模式.就简单看了下. 在<企业架构模 ...

  3. mysql启动错误之mysql启动报1067错误如何解决

    MYSQL启动报1067错误,系统日志中是“服务 mysql 意外停止” Mysql日志中则是:Plugin 'FEDERATED' is disabled. 解决方法: 1.在MY.INI文件中的 ...

  4. shell监控脚本实例—监控mysql主从复制

    分享一例shell脚本,用于监测mysql数据库的主从复制,有需要的朋友不妨参考学习下. 转自:http://www.jbxue.com/article/14103.html(转载请注明出处) 本节内 ...

  5. 关于DebuggerHidden特性在Unity中的使用

    经过测试,DebuggerHidden只对输出的日志有影响.对编辑器的控制台输入没有影响 你可以通过这个特性避免日志log有一堆的堆栈信息 并且测试过发现Debug.LogError也不支持该特性,和 ...

  6. atitit.为什么笔记本跟个手机不能组装而pc可以

    atitit.为什么笔记本跟个手机不能组装而pc可以 1. 标准程度差 1 2. 为什么标准程度差 1 3. 第一个答案是「能」.第二个答案是「麻烦」. 2 4. 为什么手机不能自定义组装 3 1.  ...

  7. JAVA List 分割

    按指定大小,分隔集合,将集合按规定个数分为n个部分 import java.util.ArrayList; import java.util.Collections; import java.util ...

  8. Spring学习10-SpringMVC入门

       二.SpringMVC请求处理流程    其中Front controller :前端控制器 Controller:后端控制器   三.Spring核心组件及请求处理流程

  9. php chr() ord()中文截取乱码问题解决方法

    今天看到chr() ord()中文截取乱码问题这个例子,觉得相当的不错,拿出来和大家分享下,有兴趣的朋友可以去试下,看看怎么样. 代码如下: <?php $lenth = ; $str = &q ...

  10. vue 和ng的区别

    vue:    读音:    v-u-e    view vue到底是什么?        一个mvvm框架(库).和angular类似        比较容易上手.小巧    mvc:       ...