简单地说 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. ps -ef | grep java 查看所有关于java的进程

    ps -ef | grep java   查看所有关于java的进程

  2. TelephonyManager&GsmCellLocation类的方法详解

    转载:http://blog.163.com/zhangzheming_282/blog/static/117920962011101944356511/ TelephonyManager类 主要提供 ...

  3. iOS 集成阿里百川最新版(3.1.1.96) 实现淘宝授权登录以及调用淘宝客户端商品详情页

      公司最近要做第三方登录,由于是做导购项目,必不可少的有淘宝的授权登录.本来就是一个授权登录,没什么大不了的.但淘宝的无线开放业务——阿里百川更新的最新版本3.1.1.96,开发文档不是不详细,是很 ...

  4. Golang中的正则表达式

    声明:文章转自GoLove 用法: 单一: . 匹配任意一个字符,如果设置 s = true,则可以匹配换行符 [字符类] 匹配"字符类"中的一个字符,"字符类" ...

  5. 内核源码阅读vim+cscope+ctags+taglist

    杜斌博客:http://blog.db89.org/kernel-source-read-vim-cscope-ctags-taglist/ 武特博客:http://edsionte.com/tech ...

  6. SonarQube 平台搭建

    1. 前期准备 ① 环境 jdk 1.8 配置(见其他随笔) MySQL 5.7(见其他随笔) ② 工具下载 sonarqube 下载 <链接:https://pan.baidu.com/s/1 ...

  7. 巨蟒django之CRM5 学习记录&&课程记录&&班级管理&&私户的数量上限

    1.公户变私户(事务+行级锁) 2.私户的数量上限 3.班级的管理 4.课程记录管理 5.学习记录的初始化 6.展示和编辑学习记录

  8. POJ 1789 Truck History【最小生成树简单应用】

    链接: http://poj.org/problem?id=1789 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...

  9. Hystrix属性配置策略

    Hystrix属性配置 Command可配参数 设置隔离策略 execution.isolation.strategy = THREAD 设置超时时间 execution.isolation.thre ...

  10. Navigation

    Makedown常用语法 1.常用标题 # 代表h1(一级标题) ## 代表h2(二级标题) ### 代表h3(三级标题) #### 代表h4(四级标题) ##### 代表h5(五级标题) ##### ...