简单地说 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. php 佛祖保佑 永无bug

    <pre name="code" class="java">/* _ooOoo_ o8888888o 88" . "88 (| ...

  2. Unity3d Resources TextAsset 文本

    一些小型数据,可以用txt文本作为媒介,进行获取.传输.修改.存储: 比如:User1.2.3.txt,放入 Resources/Data 文件下: 一,Unity3d Resources.Load ...

  3. 第四篇:了解 C++ 默默编写并调用的函数

    前言 对于一个类来说,最最基础的三类成员函数莫过于:构造函数,析构函数以及拷贝函数 (copy构造函数和=重载函数).即使你的类没有为这些函数做出定义,C++ 也会自动为你创建.本文将讲述的是 C++ ...

  4. 转:: 刺鸟:用python来开发webgame服务端(3)

    来源:http://ciniao.me/article.php?id=11 --------------- 刺鸟原创文章,转载请注明出处    在之前的准备工作中,我们已经建立了一个socket服务器 ...

  5. linux之shell常用命令介绍

    一.cd    切换目录 cd /etc  切换到/etc目录下              cd ~       切换到主目录下 cd  ..      返回上级目录                  ...

  6. 三维空间直线最近点对hdu4741

    //求两条直线之间的关系(三维) //输入:两条不为点的直线 //输出:相交返回XIANGJIAO和交点p,平行返回PINGXING,共线返回GONGXIAN int LineAndLine(Line ...

  7. 【BZOJ2882】工艺 后缀自动机

    [BZOJ2882]工艺 Description 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的 ...

  8. Splitting Pile

    Splitting Pile Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement Snuke a ...

  9. JavaScript处理数据完成左侧二级菜单的搭建

    我们在项目中应用的后台管理框架基本上都是大同小异,左侧是一个二级菜单,点击选中的菜单,右侧对应的页面展示.我把前端页面封装数据的过程整理了一下,虽然不一定适合所有的管理页面,仅作为案例来参考,只是希望 ...

  10. css 生效顺序 less 写法

    <!DOCTYPE html><html><style type="text/css">.c{color:red;}.c{color:green ...