简单地说 Interface是一组Method的组合,可以通过Interface来定义对象的一组行为。
如果某个对象实现了某个接口的所有方法,就表示它实现了该借口,无需显式地在该类型上添加接口说明。Interface是一个方法的集合,它里面没有其他类型变量,而且Method只用定义原型 不用实现

实现一个动物的接口:

package main

import "fmt"

// 定义一个 Animal接口
type Animal interface {
Eat()
Talk()
Run()
} // Dog 实现了Animal的所有方法,就可以说Dog实现了Animal这个接口
type Dog struct {
name string
} func (d *Dog) Eat() {
fmt.Printf("%s is Eating...\n", d.name)
} func (d *Dog) Talk() {
fmt.Printf("%s is Talking...\n", d.name)
} func (d *Dog) Run() {
fmt.Printf("%s is Running...\n", d.name)
} func main() {
var dog = &Dog{
name: "WangCai",
} var a Animal
a = dog
a.Run()
a.Eat()
a.Talk()
}

实现一个雇员的接口

package main

import "fmt"

type Employee interface {
Calc() float32
} type Developer struct {
Name string
Base float32
} func (d *Developer) Calc() float32 {
return d.Base
} type PM struct {
Name string
Base float32
Option float32
} func (p *PM) Calc() float32 {
return p.Base * p.Option
} type Operation struct {
Name string
Base float32
Option float32
Ratio float32 // 0.5 - 3
} func (o *Operation) Calc() float32 {
return o.Base * o.Option * o.Ratio
} type EmployeeMgr struct {
employeeList []Employee
} func (e *EmployeeMgr) Calc() float32 {
var sum float32
for _, v := range e.employeeList {
sum += v.Calc()
}
return sum
} func (e *EmployeeMgr) AddEmployee(d Employee) {
e.employeeList = append(e.employeeList, d)
} func main() {
var e = &EmployeeMgr{} dev := &Developer{
Name: "alex",
Base: ,
}
e.AddEmployee(dev) pm := &PM{
Name: "Jim",
Base: ,
Option: ,
}
e.AddEmployee(pm) oper := &Operation{
Name: "Miles",
Base: ,
Option: ,
Ratio: 1.2,
}
e.AddEmployee(oper) sum := e.Calc() fmt.Printf("the sum is: %f", sum)
}

实现error interface

// builtin.go 中的error interface

type error interface {
Error() string
}
package main

import (
"time"
"fmt"
) type MyError struct {
When time.Time
What string
} // MyError实现了 Error 这个方法,也就实现了error interface
func (e MyError) Error() string {
str := fmt.Sprintf("at %v, %s", e.When, e.What)
return str
} // 直接返回MyError对象
func run() error {
myError := MyError{time.Now(), "it didn't work"}
return myError
} func main() {
if err := run(); err != nil {
fmt.Println(err)
}
}

Go Interface概念的更多相关文章

  1. Java 基础 面向对象: 接口(interface )概念 以及接口之练习3 -定义一个接口用来实现两个对象的比较并 判断instanceof是否为同类

    接口(interface )概念概念笔记 及测试代码: /** 面向对象: 接口(interface ) 是与类并行的一个概念: * 1.接口可以看成一个特殊的抽象类,它是常量与抽象方法的一个集合 * ...

  2. Go语言的接口interface、struct和组合、继承

    Go语言的interface概念相对于C++中的基类,通过interface来实现多态功能. 在C++中,当需要实现多态功能时,步骤是首先定义一个基类,该基类使用虚函数或者纯虚函数抽象了所有子类会用到 ...

  3. `Java`中`abstract class`与`interface`区别

    abstract class Java中允许使用abstract修饰符声明方法,此时只定义方法但是不实现方法(abstract修饰的方法没有主体,只有一个签名和一个分号). 以下是abstract方法 ...

  4. iOS开发60分钟入门

    原文:https://github.com/qinjx/30min_guides/blob/master/ios.md 本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的i ...

  5. Python3学习笔记2:简易Web爬虫

    开发环境 基础语法那章的内容我是在Docker容器中玩的,但是真正做项目的时候,没有IDE的强大辅助功能来协助的话是很累人的一件事.因此从本文中,我选择使用Jetbrain的Pycharm这个IDE来 ...

  6. HttpClient4.2 Fluent API学习

    相比于HttpClient 之前的版本号,HttpClient 4.2 提供了一组基于流接口(fluent interface)概念的更易使用的API,即Fluent API. 为了方便使用,Flue ...

  7. windows生成库文件

    库文件的生成,包括静态库lib与动态库dll,需要改变编译输出的生成命令,可以一开始生成对应的库工程(或者在工程属性->常规->配置类型更改). 附基本对应命令: gcc –c -L .o ...

  8. 【Golang 接口自动化02】使用标准库net/http发送Post请求

    写在前面 上一篇我们介绍了使用 net/http 发送get请求,因为考虑到篇幅问题,把Post单独拎了出来,我们在这一篇一起从源码来了解一下Golang的Post请求. 发送Post请求 net/h ...

  9. PHP中抽象类与接口的区别

    PHP中抽象类与接口的区别 抽象类abstract 概念 定义为抽象的类不能被实例化.任何一个类,如果有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的类. 继承一个抽象类的时候,子类必须定义 ...

随机推荐

  1. mac - MAC电脑安装Mysql服务器和Navicat for mysql客户端

        1.下载链接 Navicat for mysql客户端 链接: https://pan.baidu.com/s/1dGbzgbR 密码: i43g Mysql服务器 链接: https://p ...

  2. OpenCV学习笔记:opencv_core模块

    一,简介: opencv最基础的库.包含exception,point,rect,size,slice,vector,matrix,image等数据结构,和相应的操作函数,以及一些基础算法. 二,分析 ...

  3. PHP设置时区的方法

    第一种方法:修改php.ini文件   即:date.timezone = '修改的时区名称'   对全局有效 第二种方法:date_default_timezone_set()动态设置时区,只是当前 ...

  4. W​i​n​下​h​t​t​p​d​+​p​h​p​+​m​y​s​q​l​环​境​集​成

    apache+php+mysql: php下载:  VC6就是legacy Visual Studio 6 compiler,就是使用这个编译器编译的,  VC9就是the Visual Studio ...

  5. Android无线测试之—UiAutomator UiSelector API介绍之五

    对象搜索—文本与描述 一.文本属性定位对象: 返回值 API 描述 UiSelector test(String text) 文本完全匹配 UiSelector testContains(String ...

  6. Python操作yaml文件

    基本的yaml语法 http://ansible-tran.readthedocs.io/en/latest/docs/YAMLSyntax.html YAML 还有一个小的怪癖. 所有的 YAML ...

  7. php后门管理工具weevely

    weevely是一款php后门管理工具,使用http头进行指令传输,功能强大.不过只支持php. weevely生成的服务器端php代码是经过了base64编码的,所以可以骗过主流的杀毒软件和IDS, ...

  8. js获取滚动条的位置

    页面具有 DTD,或者说指定了 DOCTYPE 时,使用 document.documentElement. 页面不具有 DTD,或者说没有指定了 DOCTYPE,时,使用 document.body ...

  9. CSV导出

    CSV 导入导出工具类 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; impor ...

  10. VSpy之C Code Interface的使用

    Spy3 要运行 CCodeInterface 功能,需要安装运行环境,建议安装 Visual Studio2003,2005,2008,2010 或更新的版本.当然也可以安装 VC express ...